【问题标题】:Does MongoDB's $elemMatch projection guarantee the returned element is the same one that was matched in the query?MongoDB 的 $elemMatch 投影是否保证返回的元素与查询中匹配的元素相同?
【发布时间】:2016-09-03 16:42:39
【问题描述】:

假设我有一个包含这个单一文档的集合:

{
    "_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 将返回 whole 匹配的文档,我想专门投影匹配(也已修改)的数组项,所以我将在我的查询中添加一个 fields 部分:

db.col.findAndModify({
    query: {
        items: {
            $elemMatch: {
                prodType: "hardware"
            }
        }
    },
    update: {
        $set: {
            "items.$.checked": true
        }
    },
    fields: {
        items: {
            $elemMatch: {
                prodType: "hardware"
            }
        }
    }
})

现在问题是:MongoDB 是否保证我的查询返回的数组项与update 部分中匹配(和修改)的数组项完全相同,即使我们有两个项匹配条件?

【问题讨论】:

    标签: mongodb mongodb-query


    【解决方案1】:

    是的。它将仅返回与您的条件匹配并在更新部分进行修改的第一个子文档,如here

    【讨论】:

      【解决方案2】:

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

      $ (update) 状态:

      位置 $ operator 充当与 query document 匹配的 first 元素的占位符

      $elemMatch (projection) 表示:

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

      它们都适用于 first 数组元素,因此它直接暗示修改后的数组元素是被投影的元素

      【讨论】:

        猜你喜欢
        • 2023-03-04
        • 2016-03-26
        • 1970-01-01
        • 1970-01-01
        • 2016-02-17
        • 2023-03-24
        • 2017-04-24
        • 1970-01-01
        相关资源
        最近更新 更多