繁体   English   中英

具有多个数组选择器的MongoDB update $ update运算符

[英]MongoDB update $ update operator with multiple array selector

我正在尝试使用$ update运算符更新数组中的元素。 该文档包含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。

更新操作查询中 ,将点符号用作:

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"
            }
        }
    }
)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM