MongoDB:更新数组中某个项目的字段,使其与该项目的另一个字段匹配

Ali*_*aaa 2 mongodb mongodb-query

我有一个这样的数据结构:
我们有一些centers。A center有一些switches。A switch有一些ports

    {
     "_id" : ObjectId("561ad881755a021904c00fb5"),
     "Name" : "center1",
     "Switches" : [
        {
            "Ports" : [
                {
                    "PortNumber" : 2,
                    "Status" : "Empty"
                },
                {
                    "PortNumber" : 5,
                    "Status" : "Used"
                },
                {
                    "PortNumber" : 7,
                    "Status" : "Used"
                }
            ]
        }
     ]
  }
Run Code Online (Sandbox Code Playgroud)

我只想编写一个Update查询以Status将端口号PortNumber5更改为“ Empty”。
当我知道此查询的端口的数组索引(此处数组索引为1)时,可以对其进行更新:

db.colection.update(
    // query
    {
        _id: ObjectId("561ad881755a021904c00fb5")
    },
    // update 
    {
        $set : { "Switches.0.Ports.1.Status" : "Empty" }
    }
);
Run Code Online (Sandbox Code Playgroud)

但是我不知道那个端口的数组索引。
感谢帮助。

Dmy*_*nko 5

通常,您可以使用位置运算符执行此操作$,如对此问题的答案所述:

更新MongoDB中精确元素数组中的字段

不幸的是,现在位置运算符仅支持深度匹配的一个数组级别。

对于您想要的行为,有一张JIRA票证:https : //jira.mongodb.org/browse/SERVER-831

如果可以Switches改用一个对象,则可以执行以下操作:

db.colection.update(
    {
        _id: ObjectId("561ad881755a021904c00fb5"),
        "Switch.Ports.PortNumber": 5
    }, 
    {
        $set: {
            "Switch.Ports.$.Status": "Empty"
        }
    }
)
Run Code Online (Sandbox Code Playgroud)