更新了MongoDB中的嵌套子文档

时间:2014-07-31 11:57:13

标签: mongodb subdocument

我正在尝试更新mongodb中的嵌套子文档,

  {
id: 100, 
     status: [ { 

                 campaigns: [ 
                    { timestamp: "2014-07-30", 
                      task: [
                                { 
                                  id: "1",
                                  created: "2014-07-30"
                                } 

                        ]
                    }, 
                    { timestamp: "2014-07-31", 
                      task: [
                                { 
                                  id: "2",
                                  created: "2014-07-31" // need to update this field
                                } 

                        ]
                    }, 
                ]
            }, 
        ]

    }

更新查询

db.collectionname.update({"id": 100,"status.campaigns.task.id":"2"},{$set:{"status.0.campaigns.$.task.created:"2014-08-01"}});

以上查询仅更新第一条记录(task.id =“1”创建日期),而不更新task.id =“2”子文档!!!!

2 个答案:

答案 0 :(得分:1)

  

嵌套数组   位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$ placeholder的替换是单个值

检查mongoDB docs on positional operator

那么你有三个嵌套数组statuscampaignstask。位置操作员将无法工作。

我的猜测是最里面的位置(最里面的数组)存储在$中。这就是为什么$0的原因。

如果您有兴趣并投票支持此问题,请关注JIRA trackable

答案 1 :(得分:0)

可以更新子文档,但您需要知道它在文档结构中的各种嵌套数组中的位置。如果这样,您可以遵循特定的编号方案,为您插入嵌套数组的子文档的id字段。

如果这对您来说是可行的策略,那么您的update()将不需要第一个参数中的第二个键/值对,因为您只是在查找包含要更新的子文档的文档以及_id字段是唯一的。对于第二个参数,您将使用您对嵌套数组中子文档位置的索引。

对于您发布的示例文档,您要更新第二个created数组的第一个元素中的task字段。 campaign数组的 first 元素中status数组的元素,然后执行以下操作:

db.collection.update({ "_id": 100}, { $set: { "status.0.campaigns.1.task.0.created" : "2014-08-01" }});

但是,如果您不知道要更新的子文档的位置,那么您将无法更新它。这是因为,如documentation中所述,“位置运算符不能用于遍历多个数组的查询”。