MongoDB:通过匹配该项目的另一个字段来更新数组中项目的字段

标签 mongodb mongodb-query

我有这样的数据结构:
我们有一些中心中心 有一些开关开关有一些端口

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

我只想编写一个更新查询,将 PortNumber 为 5 的端口的 Status 更改为“Empty”。
当我知道端口的数组索引(此处数组索引为 1)时,我可以使用此查询更新它:

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

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

最佳答案

您通常会使用位置运算符 $ 来执行此操作,如该问题的答案中所述:

Update field in exact element array in 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"
        }
    }
)

关于MongoDB:通过匹配该项目的另一个字段来更新数组中项目的字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33171078/

相关文章:

arrays - 如何在 MongoDB 中检索对象内的不同键

MongoDB:如果使用 $addToSet 或 $push,是否应该预分配文档?

mongoDB白名单IP

Javascript 作用域规则和 mongo map/reduce 函数

python - Pymongo $push 不更新数组,也不异常(exception)

mongodb - 蒙戈 : How to automatically connect to secondary in case of primary failure

java - 使用 mongo java 驱动程序 3.0+ 满足条件时替换 mongo 文档

java - 使用 Micronaut 为 MongoDB 注册编解码器

Mongodb 计算集合中某个值存在的频率

database - 解析服务器,MongoDB - 获取对象的 "liked"状态