将MongoDB$objects($oid,$date,$binary..)转换为Mongoose对象



嗯,我已经使用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是一个ObjectIddue_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没有任何DateObjectId的类型。

为了插入这些值,您需要使用知道此扩展格式的 JSON 解析器。

一种可能性是bson中包含的json_util.

或者,您可以使用mongoimport来读取JSON文件并为您进行插入。

最新更新