【问题标题】:nodejs - mongoose - create a document from json filenodejs - mongoose - 从 json 文件创建一个文档
【发布时间】:2019-05-08 12:25:51
【问题描述】:

我将 mongodb 文档保存在 JSON 文件中。

我想编写 nodejs 代码来从这个 JSON 文件创建一个新的 mongodb 文档。

我尝试了两种方法,都失败了。

1) 如果 JSON 文件有 ObjectId("xxxxxxx"),nodejs 代码无法执行 JSON.parse(),因为它不是有效的 JSON 文件

2) 如果我使用 mongoexport 导出文档,我会得到如下信息: { _id: { '$oid': '5bf6e973180a93001bc5c895' } },之后 JSON.parse() 工作,但插入失败。

在 nodejs 代码中是否有其他方法(不是命令行)?


我只是认为 mongoose 是否具有创建文档的功能,它采用字符串而不是对象?如果是这样,我不需要使用 JSON.pares() 来解析这个字符串。只需从文件中读取,然后发送给 mongoose。

【问题讨论】:

  • 您是否出于某种原因需要将_id 存储在JSON 文件中? _id 属性是一个 MongoDB 结构,如果您不提供,数据库将自动为您生成一个。您可以找到 _id 文档属性 here 的文档。
  • 不仅是_id。我还有其他属于 ObjectId() 类型的字段。另外,我有 Date() 类型。所有的 JS 对象都不能保存为有效的 JSON 字符串。

标签: node.js mongodb mongoose


【解决方案1】:

JSON 不支持自定义对象类型是正确的,JSON 中只有基元(对象、数组、数字、布尔值、字符串等)可用。如果您要存储有效的 JSON(如 #2 中所示),则可以在使用 JSON.parse() 时实现 reviver 回调。这将允许您在反序列化对象时将它们转换为它们各自的类。

const ObjectId = require('mongoose').Types.ObjectId;

const json = `{ 
  "_id": { "$oid": "5bf6e973180a93001bc5c895" }, 
  "date": { "$date": "2018-12-06" }
}`;

const classes = {
    '$oid': ObjectId,
    '$date': Date
};

const parsed = JSON.parse(json, (key, value) => {

    // If the key matches one of the classes convert the value.
    const Class = classes[key];
    if (Class) {
        return new Class(value);
    }

    // If the value is a normal object (e.g. not an array) look
    // at the first property to determine if the object is one
    // of the classes, if it is return the first property's value.
    if (Object.prototype.toString.call(value) === '[object Object]') {
        const firstProp = Object.keys(value)[0];
        if (classes.hasOwnProperty(firstProp)) {
            return value[firstProp];
        }
    }

    // Value does not need to be transformed.
    return value;
});

这种方法肯定有局限性,并且给定的实现不能处理所有情况,但它绝对可以针对个别用例进行定制。

【讨论】:

  • 非常感谢。我会试试这个。
  • 我唯一想提的是 JSON.parse(json... 不应该是 JSON 而是一个字符串,所以这个名字是误导......
猜你喜欢
  • 2013-03-02
  • 2018-05-10
  • 2016-11-26
  • 1970-01-01
  • 2016-04-30
  • 1970-01-01
  • 2016-06-28
  • 2019-10-05
  • 1970-01-01
相关资源
最近更新 更多