我正在尝试更新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”子文档!!!!
答案 0 :(得分:1)
嵌套数组 位置$运算符不能用于遍历多个数组的查询,例如遍历嵌套在其他数组中的数组的查询,因为$ placeholder的替换是单个值
检查mongoDB docs on positional operator
那么你有三个嵌套数组status
,campaigns
,task
。位置操作员将无法工作。
我的猜测是最里面的位置(最里面的数组)存储在$
中。这就是为什么$
为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中所述,“位置运算符不能用于遍历多个数组的查询”。