更新了MongoDB中的嵌套子文档
我正在尝试更新mongodb中的嵌套子文档更新了MongoDB中的嵌套子文档,mongodb,subdocument,Mongodb,Subdocument,我正在尝试更新mongodb中的嵌套子文档 { id: 100, status: [ { campaigns: [ { timestamp: "2014-07-30", task: [ { id: "1",
{
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不支持嵌套数组的位置运算符。你应该考虑改变你的模式。你能为上面的例子提供任何模式设计吗?它不是那么简单。你需要考虑很多因素,比如查询、读取频率、写频率以及类似的东西来设计一个好的模式。更适合这样的东西