我有以下收藏:
{
"_id": 11,
"outerArray": [
{ "_id" : 21,
"field": {
"innerArray" : [
1,
2,
3
]
}
},
{ "_id" : 22,
"field": {
"innerArray" : [
2,
3
]
}
},
{ "_id" : 23,
"field": {
"innerArray" : [
2
]
}
}
]
}
我需要遍历集合中的所有文档并推送到 innerArray
新元素 4
,如果 innerArray
已经包含元素 1
或元素 3
< /p>
我尝试这样做,其他一些与此类似,但没有按预期工作,它只推送到 innerArray
的第一个元素的 outerArray
db.collection.updateMany(
{ "outerArray.field.innerArray": { $in: [ 1, 3 ] } },
{ $push: { "outerArray.$.field.innerArray": 4} }
)
如何让它推送到所有对应的innerArrays
?
答案 0 :(得分:2)
这里的问题是你对很多事情的误解。
当您在查询中执行 "outerArray.field.innerArray": { $in: [ 1, 3 ] }
时,您不会只得到 innerArray
where has 1 or 3.您正在获取存在这些数组的文档。
因此您正在查询整个文档。
当过滤器匹配时,您必须使用 arrayFilter
来更新值。
所以,如果我没理解错的话,你想要的查询是:
db.collection.update(
{}, //Empty object to find all documents
{
$push: { "outerArray.$[elem].field.innerArray": 4 }
},
{
"arrayFilters": [ { "elem.field.innerArray": { $in: [ 1, 3 ] } } ]
})
示例here
注意 update
中的第一个对象是如何为空的。您必须将字段放在那里以匹配文档(而不是数组,文档)。
如果您只想更新一个文档,您必须用您想要的值填充第一个对象(查询对象),例如:{"_id": 11}
。