我有以下收藏
[
{"_id":1,"data" :[{"a":1},{"b":2},{"c":3}] },
{"_id":2,"data" :[{"a":1},{"b":2}] },
{"_id":3,"data":[{"c":3},1,2,3]},
{"_id":4,"data":[{"b":1},{"d":2},{"c":3}]},
{"_id":5,"data":[{"c":2},{"a":3}]},
{"_id":6,"data":[0,2,3]},
{"_id":7,"data":[{"b":4},{"c":3}]}
]
我还具有以下更新集,我想用来更新集合中的数据数组
[
{"id":1,"old":{"c":3}, "new":{"v":2}},
{"id":4, "old":{"b":1},"new":{"v":3}},
{"id":5, "old":{"a":3},"new":{"v":3}},
{"id":7, "old":{"c":2},"new":{"v":3}}
]
对于这些数据点中的每一个,如果在文档的数据数组中找到“ _id” =“ id”的旧数据,我想将其替换为新值。输出应如下所示:
[
{"_id":1,"data" :[{"a":1},{"b":2},{"v":2}] },
{"_id":2,"data" :[{"a":1},{"b":2}] },
{"_id":3,"data":[{"c":3},1,2,3]},
{"_id":4,"data":[{"v":3},{"d":2},{"c":3}]},
{"_id":5,"data":[{"c":2},{"v":3}]},
{"_id":6,"data":[0,2,3]},
{"_id":7,"data":[{"b":4},{"c":3}]}
]
到目前为止,我的解决方案是遍历更新集并为每个数据点执行以下更新查询:
myCollection.update({"_id":id,"data":old},{"$set":{"data.$":new}})
有没有办法一次执行所有更新?
我有从csv类似的导入方法。我进行查找并遍历数据以比较并构建更新数组。然后将其输入到bulkWrite()方法中。
https://docs.mongodb.com/manual/core/bulk-write-operations/
编辑-
因为您要根据自己的标准进行操作,所以您必须在bulkwrite中执行许多updateOne()。因此,它将类似于以下内容。
我习惯于javascript,所以示例在其中而不是在shell中。但是您应该知道如何构建对象。
let mongoUpdates = []
let newStuff = [
{"id":1,"old":{"c":3}, "new":{"v":2}},
{"id":4, "old":{"b":1},"new":{"v":3}},
{"id":5, "old":{"a":3},"new":{"v":3}},
{"id":7, "old":{"c":2},"new":{"v":3}}
]
mongoUpdates = newStuff.map(item => {
return {
updateOne: {
"filter": {
_id: item.id,
date: item.old
},
"update": { $set: { "data.$" : item.new } }
}
}
})
collection.bulkWrite(mongoUpdates)
所以我正在使用:
https://docs.mongodb.com/manual/reference/method/db.collection.updateOne/对于每个要适当查找和设置更新的项目
然后https://docs.mongodb.com/manual/reference/operator/update/positional/#up。S查找数组中“旧”的位置,然后将“新”放置在数组上
然后调用数组中的批量对象,该批量对象包含的每个项目都包含一个updateOne。
该代码未经测试,但可以使您更加接近所需的位置。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句