将字段推送到对象数组(MongoDB)的每个元素

时间:2018-08-08 09:51:43

标签: javascript mongodb

假设我有一些此类文件:

{ 
 _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}})
})

3 个答案:

答案 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" }})