问题描述
我的mongoDB集合看起来像这样:
[
{
"id": "myid","field": {
"total": 1,"subfield": [
{
"time": "2020-08-06T08:33:57.977+0530"
},{
"time": "2020-05-08T04:13:27.977+0530"
}
]
}
},{
"id": "myid2","subfield": [
{
"time": "2020-07-31T10:15:50.184+0530"
}
]
}
}
]
我需要更新所有文档,并将time
数组中可用的字段subfield
中的日期字符串转换为mongoDB ISO日期格式。
我在subfield
数组中有成千上万个文档和数百个对象
我知道聚合函数$todate
和$convert
。
但我不想使用聚合,因为
-
要使用
$todate
或$convert
,我需要展开{{1}}数组,这又是一个昂贵的操作。 -
我想更新我的文档并将其保存为日期格式。
我的MongoDB服务器版本:4.0.3
我尝试了以下操作,但它似乎不起作用,也没有返回任何错误。
field.subfield
解决方法
您错过了subfield
的循环,因为它是一个数组,
db.collection.find().forEach(function(doc) {
doc.field.subfield.forEach(function(r) {
r.time = new ISODate(r.time);
})
db.collection.save(doc);
})
如果这是一次,那么时间并不重要,我认为如果您使用聚合或forEach,两者都将花费相同的时间。
如果您打算更新MongoDb版本,请填写表格4.2,
您可以使用update with aggregation pipeline使用updateMany()
更新的选项,
db.collection.updateMany({},[{
$set: {
"field.subfield": {
$map: {
input: "$field.subfield",as: "r",in: {
$mergeObjects: [
"$$r",{ time: { $toDate: "$$r.time" } }
]
}
}
}
}
}]
)