nodejs-猫鼬-从json文件创建文档

时间:2018-12-06 18:31:27

标签: node.js mongodb mongoose

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

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

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

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

2)如果我使用mongoexport导出文档,则会得到类似以下内容的信息: {_id:{'$ oid':'5bf6e973180a93001bc5c895'}},此后,JSON.parse()有效,但插入失败。

在nodejs代码中(还有命令行)还有其他方法吗?


我只是认为猫鼬是否具有创建文档的功能,该功能采用String而不是Object?如果是这样,我不需要使用JSON.pares()来解析此字符串。只需从文件中读取它,然后将其发送给猫鼬即可。

1 个答案:

答案 0 :(得分:0)

您是正确的,JSON不支持自定义对象类型,JSON中仅提供原语(对象,数组,数字,布尔值,字符串等)。如果要存储有效的JSON(如#2),则可以在使用reviver时实现JSON.parse()回调。这样,您可以在对对象进行反序列化时将其转换为各自的类。

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;
});

这种方法当然有局限性,并且给定的实现方式无法解决所有情况,但可以针对各个用例进行量身定制。