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

Mongodb更新:向集合数组的每个元素添加一个字段,mongodb,Mongodb,标题第一次有点难理解,所以这里有一个例子。我使用mongodb,数据如下: id: String timestamp: String steps: [{ action: 1, timestamp: String }, { action: 2, timestamp: String }, ... ] 我想为每个步骤添加一个新字段,假设bot:false。 我尝试了如下更新: { $set: { 'steps': { 'bot': false } } } 然而,这取代了整个步骤,丢

标题第一次有点难理解,所以这里有一个例子。我使用mongodb,数据如下:

id: String
timestamp: String
steps: [{
  action: 1,
  timestamp: String
}, {
  action: 2,
  timestamp: String
}, ...
]
我想为每个步骤添加一个新字段,假设bot:false。 我尝试了如下更新:

{ $set: { 'steps': { 'bot': false } } }
然而,这取代了整个步骤,丢失了操作/时间戳。 我还尝试:

{ $set: { 'steps.bot': false } }
这也不起作用,因为steps是一个数组

我还研究了$each修饰符,但是它似乎不适用于$set

有什么想法吗?
谢谢

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

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

根据你的问题,我认为你的文件结构如下

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

谢谢:正如我所想,它需要一点脚本。问题解决:谢谢:正如我所想,它需要一点脚本。解决的问题: