嗯,我已经使用MongoDB一段时间了,但我不知道如何处理这种情况。
场景是:我在MongoDB中插入了数据。我以 JSON 格式导出了数据,如下所示:
[
{
"_id": { "$oid": "60ff324f41c4d5b96054390d" },
"field": {
"due_date": { "$date": "2021-11-03T00:09:18.271Z" }
}
}
]
你可以看到:
_id
{ "$oid": "60ff324f41c4d5b96054390d" }
和date
{ "$date": "2021-11-03T00:09:18.271Z" }
.
因此,问题是尝试使用猫鼬插入另一个数据库。我想测试一些隔离的功能,所以我不想在其他环境中使用这些值,所以我对之前导出的 JSON 使用了insertMany()
。
(也许有一种更优雅的方式来导入 JSON 文件,但仅用于测试目的)
await model.insertMany(JSON.parse(fs.readFileSync('./data.json').toString()))
但问题就在这里:它抛出了一个错误,因为我的模式说_id
是一个ObjectId
,due_date
是一个Date
对象,但它们实际上被读取为对象:{$oid: ""}
和{$date: ""}
ValidationError: model validation failed: _id: Cast to ObjectId failed for value "{ '$oid': '60ff324f41c4d5b96054390d' }" (type Object) at path "_id", field.due_date: Cast to date failed for value "{ '$date': '2021-11-03T00:09:18.271Z' }" (type Object) at path "field.due_date"
所以问题是:有没有办法在插入时使用猫鼬投射$oid
和$date
对象?
此外,我还设法使用一个非常丑陋的脚本插入值,该脚本遍历每个值并检查对象是$oid
还是$date
并修改值......但它有效。
所以问题不在于:"有没有解决方法?"而是"有没有办法直接将猫鼬函数作为insertMany
并自动投射来做到这一点?">
谢谢。
{"$oid": ...}
和{"$date":...}
构造是MongoDB扩展的JSON表示法,因为JSON没有任何Date
或ObjectId
的类型。
为了插入这些值,您需要使用知道此扩展格式的 JSON 解析器。
一种可能性是bson
中包含的json_util
.
或者,您可以使用mongoimport来读取JSON文件并为您进行插入。