Mongodb更新:为集合数组的每个元素添加一个字段

时间:2014-12-23 11:03:01

标签: mongodb

标题第一次有点难以理解,所以这是一个例子。我使用mongodb并拥有这样的数据:

id: String
timestamp: String
steps: [{
  action: 1,
  timestamp: String
}, {
  action: 2,
  timestamp: String
}, ...
]

我想在每个步骤中添加一个新字段,让我们说bot: false。 我尝试了更新,如:

{ $set: { 'steps': { 'bot': false } } }

然而,这取代了整个步骤,失去了动作/时间戳。 我也尝试过:

{ $set: { 'steps.bot': false } }

这也没有用,因为步骤是一个数组。

我还查看了$ each修饰符,但它似乎与$ set无关。

有什么想法吗? 感谢

1 个答案:

答案 0 :(得分:4)

根据您的问题,我认为您的文档结构如下

    {
    "_id" : ObjectId("54996f980e64b1a2fcb4824e"),
    "id" : "1",
    "timestamp" : "Tue, 23 Dec 2014 13:37:33 GMT",
    "steps" : [
        {
            "action" : 1,
            "timestamp" : "Tue, 23 Dec 2014 13:37:40 GMT"

        },
        {
            "action" : 2,
            "timestamp" : "Tue, 23 Dec 2014 13:37:40GMT"

        }
    ]
}

在上面的文档中,您想要添加像steps.bot:false这样的新字段,因此您应该使用以下javascript来更新嵌套文档

    db.collectionName.find({
   "steps":{"$exists":true}}).forEach(function(data){
    for(var i=0;i<data.steps.length;i++) {
      db.demo.update(
     { 
         "_id": data._id, 
         "steps.action": data.steps[i].action 
     },
     {
         "$set": {
           "steps.$.bob":
               false
         }
     },true,true
      );
  }
})