【问题标题】:MongoDB update $ update operator with multiple array selector具有多个数组选择器的 MongoDB 更新 $ 更新运算符
【发布时间】:2016-10-24 11:41:18
【问题描述】:

我正在尝试使用 $ 更新运算符更新数组中的元素。该文档包含 2 个数组字段,我必须同时查询这两个字段才能选择正确的文档。

集合名为locations,文档如下所示:

{
    "_id" : "XqEQYpitGFG3nnf3C",
    "wallpapers" : [ 
        {
            "_metadata" : {
                "master" : "vwb22W4MhkqtvAp89",
                "isMaster" : false
            },
            "role" : "master",
            "_id" : ""
        }, 
        {
            "_metadata" : {
                "master" : "vwb22W4MhkqtvAp89",
                "isMaster" : false
            },
            "role" : "clone",
            "_id" : ""
        }, 
        {
            "_metadata" : {
                "master" : "vwb22W4MhkqtvAp89",
                "isMaster" : false
            },
            "role" : "pod",
            "_id" : ""
        }
    ],
    "ancestors" : [ 
        "vwb22W4MhkqtvAp89", 
        "tqzqfum9uMs47xcHW", 
        "b4d83aqTkq6TGvXts", 
        "XqEQYpitGFG3nnf3C"
    ]
}

更新操作符如下所示:

db.getCollection('locations').update(
    {
        "ancestors": "b4d83aqTkq6TGvXts",
        "wallpapers": {
            "$elemMatch": {
                "role": "clone",
                "_metadata.master": "vwb22W4MhkqtvAp89"
            }
        }
    },
    {
        "$set": {
            "wallpapers.$": {
                "_id": "D33WNZh7Bg4itPdhk",
                "_metadata": {
                    "master": "b4d83aqTkq6TGvXts",
                    "isMaster": false
                },
                "role": "clone"
            }
        }
    }
)

所以我想替换 wallpapers 数组中的元素。但是,我得到的结果是:

{
    "_id" : "XqEQYpitGFG3nnf3C",
    "wallpapers" : [ 
        {
            "_metadata" : {
                "master" : "vwb22W4MhkqtvAp89",
                "isMaster" : false
            },
            "role" : "master",
            "_id" : ""
        }, 
        {
            "_metadata" : {
                "master" : "vwb22W4MhkqtvAp89",
                "isMaster" : false
            },
            "role" : "clone",
            "_id" : ""
        }, 
        {
            "_id" : "D33WNZh7Bg4itPdhk",
            "_metadata" : {
                "master" : "b4d83aqTkq6TGvXts",
                "isMaster" : false
            },
            "role" : "clone"
        }
    ],
    "ancestors" : [ 
        "vwb22W4MhkqtvAp89", 
        "tqzqfum9uMs47xcHW", 
        "b4d83aqTkq6TGvXts", 
        "XqEQYpitGFG3nnf3C"
    ]
}

所以它替换了错误的元素。 似乎.$ 所指的位置是ancestors 字段的选择器中的位置。

这是错误还是限制?是否有解决方案(例如 .$1.$2 之类的东西?

我使用的是 MongoDB 3.2.6。

【问题讨论】:

    标签: arrays mongodb


    【解决方案1】:

    在您的update operation query 中,将dot notation 用作:

    db.getCollection('locations').update(
        {
            "ancestors": "b4d83aqTkq6TGvXts",
            "wallpapers.role": "clone", // <--- dot notation
            "wallpapers._metadata.master": "vwb22W4MhkqtvAp89" // <-- dot notation
        },
        {
            "$set": {
                "wallpapers.$": {
                    "_id": "D33WNZh7Bg4itPdhk",
                    "_metadata": {
                        "master": "b4d83aqTkq6TGvXts",
                        "isMaster": false
                    },
                    "role": "clone"
                }
            }
        }
    )
    

    【讨论】:

    • 谢谢,这似乎有效。但是您知道为什么它不适用于 $elemMatch,而是适用于您的版本吗?
    • 使用点表示法的更新操作有效,因为$elemMatch 要求相同的嵌套元素具有值,而使用点表示法允许任何嵌套元素具有任何值。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-20
    • 1970-01-01
    • 2020-04-26
    • 1970-01-01
    • 2021-06-09
    • 2015-01-28
    相关资源
    最近更新 更多