MongoDB的$ elemMatch投影是否保证返回的元素与查询中匹配的元素相同?

时间:2016-09-02 14:22:47

标签: mongodb mongodb-query

我们说我有一个这个单一文件的集合:

{
    "_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部分中匹配(和修改)的完全相同,即使我们有两个符合条件的项目?

2 个答案:

答案 0 :(得分:1)

YES。它将仅返回符合您条件的第一个子文档,并在更新部分中进行了修改,如图所示here

答案 1 :(得分:0)

根据官方文档,然后是 - 投影数组元素是使用由位置运算符修改的相同元素修改的元素。

$ (update)州:

  

位置$ operator充当与query document

匹配的第一个元素的占位符

$elemMatch (projection)州:

  

$elemMatch运算符会限制查询结果中<array>字段的内容,使其仅包含与$elemMatch条件匹配的第一个元素

它们都适用于第一个数组元素,因此它直接暗示修改后的数组元素是投射的元素