Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
更新了MongoDB中的嵌套子文档_Mongodb_Subdocument - Fatal编程技术网

更新了MongoDB中的嵌套子文档

更新了MongoDB中的嵌套子文档,mongodb,subdocument,Mongodb,Subdocument,我正在尝试更新mongodb中的嵌套子文档 { id: 100, status: [ { campaigns: [ { timestamp: "2014-07-30", task: [ { id: "1",

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

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

检查

因此,您有三个嵌套数组
状态
活动
任务
。“位置”操作符将不起作用

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


如果您对此问题感兴趣,请遵循并投赞成票。

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

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

对于您发布的示例文档,您正在更新
状态
数组的第一个元素中的
活动
数组的第二个元素中的
任务
数组的
创建的
字段,然后执行以下操作:

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

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

为什么要使用
status.0
?您是否只需要更新
状态
数组中的第一个条目?营地位置参数而非状态数组中的问题如果需要,您可以更新任务,但需要知道其在数组中的位置。您事先知道吗?对于您当前的模式,您不能在一个更新查询中完成它。重新思考您的模式可能会有所帮助。这是一个已知的问题,我需要在phpIt的yiimongodsuite中这样做并不重要。MongoDB不支持嵌套数组的位置运算符。你应该考虑改变你的模式。你能为上面的例子提供任何模式设计吗?它不是那么简单。你需要考虑很多因素,比如查询、读取频率、写频率以及类似的东西来设计一个好的模式。更适合这样的东西