0

我正在尝试更新 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" 子文档!!!!

4

2 回答 2

1

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

检查位置运算符上的 mongoDB 文档

那么你有没有三个嵌套数组status, campaigns, task. 位置运算符将不起作用。

我的猜测是最里面的位置(最里面的数组)存储在$. 这就是你得到$ as的原因0

如果您有兴趣,请关注此问题的JIRA 可追踪并投票。

于 2014-07-31T12:16:57.607 回答
0

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

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

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

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

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

于 2014-07-31T14:27:44.240 回答