【问题标题】:Mongodb update : add a field to each elements of an array of collections [duplicate]Mongodb更新:为集合数组的每个元素添加一个字段[重复]
【发布时间】:2015-02-21 12:25:58
【问题描述】:

第一次看标题有点难理解,举个例子吧。我使用 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。

有什么想法吗? 谢谢

【问题讨论】:

    标签: mongodb


    【解决方案1】:

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

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

    【讨论】:

    • 谢谢 :) 正如我所想,它需要一些脚本。问题解决了:)
    猜你喜欢
    • 1970-01-01
    • 2021-01-04
    • 2011-12-04
    • 2015-09-06
    • 1970-01-01
    • 2018-07-26
    • 1970-01-01
    • 2021-06-26
    相关资源
    最近更新 更多