我将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()来解析此字符串。只需从文件中读取它,然后将其发送给猫鼬即可。
答案 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;
});
这种方法当然有局限性,并且给定的实现方式无法解决所有情况,但可以针对各个用例进行量身定制。