假设我有一些此类文件:
{
_id: ObjectId("5abe0f5add80a30001eff68d"),
obj_array: [
{
a: 1,
b: "some",
c: 134
},
{
a: 2,
b: "aaa",
c: 564
}
]
}
我需要做的是通过推送新字段 obj_array
来更新所有d: "new_value"
元素。预期结果:
{
_id: ObjectId("5abe0f5add80a30001eff68d"),
obj_array: [
{
a: 1,
b: "some",
c: 134,
d: "new_value"
},
{
a: 2,
b: "aaa",
c: 564,
d: "new_value"
}
]
}
除了构建新的obj_array
对象并使用新数组设置doc.obj_array
之外,我没有找到其他解决方案。我想知道有没有更优雅的方式做到这一点?
这是我的代码:
myTable.find().forEach(function(document) {
var new_array = [];
document.obj_array.forEach(function(elem) {
elem.d = "new_value";
new_array.push(elem);
})
myTable.update({_id: document._id}, {$set: {obj_array: new_array}})
})
答案 0 :(得分:1)
您可以使用$[]
所有位置运算符来更新数组中的所有元素
myTable.update(
{ "_id": document._id },
{ "$set": { "obj_array.$[].d": "new_value" }}
)
答案 1 :(得分:1)
1:运行命令npm install async --save
db.collection.find({_id:ObjectId("5abe0f5add80a30001eff68d")},function(err, result){
if(result){
async.eachSeries(result.obj_array,function(value, cb){
value.d = "new_value";
return cb();
},function(){
console.log(result)
})
}
})
//Once you get perfect result you can execute update query
db.collection.update({_id:ObjectId("5abe0f5add80a30001eff68d")},result)
注意:如果使用nodeJS,则需要安装async,如果您使用 使用核心javascript,则可以更改为通用的for-each循环。
它总是对我有用:)
答案 2 :(得分:1)
您可以简单地通过遍历$[]
并更新它来实现此目的:
单次更新:
db.getCollection('test').update({},{ "$set": { "array.$[].key": "Value" }})
多个更新:
db.getCollection('test').updateMany({},{ "$set": { "array.$[].key": "Value" }})