我们说我有一个这个单一文件的集合:
{
"_id" : ObjectId("…"),
"cartId" : "61",
"items" : [
{
"prodType" : "hardware",
"prod" : "screwdriver",
"checked": false
},
{
"prodType" : "hardware",
"prod" : "hammer",
"checked": false
},
{
"prodType" : "decor",
"prod" : "vase",
"checked": false
}
]
}
我想findAndModify
找到任何硬件产品并修改其checked
字段。然后它会是这样的:
db.col.findAndModify({
query: {
items: {
$elemMatch: {
prodType: "hardware"
}
}
},
update: {
$set: {
"items.$.checked": true
}
}
})
好的,但这不是整个故事。 findAndModify
将返回整个匹配的文档,我想专门投影匹配(并且也已修改)的数组项,因此我将添加fields
我的查询部分:
db.col.findAndModify({
query: {
items: {
$elemMatch: {
prodType: "hardware"
}
}
},
update: {
$set: {
"items.$.checked": true
}
},
fields: {
items: {
$elemMatch: {
prodType: "hardware"
}
}
}
})
现在问题是:MongoDB是否保证我的查询中返回的数组项与update
部分中匹配(和修改)的完全相同,即使我们有两个符合条件的项目?
答案 0 :(得分:1)
YES。它将仅返回符合您条件的第一个子文档,并在更新部分中进行了修改,如图所示here
答案 1 :(得分:0)
根据官方文档,然后是 - 投影数组元素是使用由位置运算符修改的相同元素修改的元素。
位置
匹配的第一个元素的占位符$ operator
充当与query document
$elemMatch
运算符会限制查询结果中<array>
字段的内容,使其仅包含与$elemMatch
条件匹配的第一个元素
它们都适用于第一个数组元素,因此它直接暗示修改后的数组元素是投射的元素