【问题标题】:Update array with multiple conditions in mongodb在 mongodb 中使用多个条件更新数组
【发布时间】:2018-08-05 20:19:17
【问题描述】:

我有这份文件:

{
    "_id" : ObjectId("5b673f525ef92ec6ef16504e"),
    "events" : [ 
        {
            "name" : "Winner",
            "map" : 0,
            "something" : []
        }, 
        {
            "name" : "Winner",
            "map" : 2,
            "something" : []
        }, 
        {
            "name" : "DifferentName",
            "map" : 2,
            "something" : []
        }
    ]
}

如果我运行以下更新:

db.getCollection('test').updateOne({
    "_id": ObjectId("5b673f525ef92ec6ef16504e"),
    "events.name": "Winner",
    "events.map": 2
},
{$push: {
        "events.$.something": {
                something: "test",
        }
    }
})

我得到了不好的结果:

{
    "_id" : ObjectId("5b673f525ef92ec6ef16504e"),
    "events" : [ 
        {
            "name" : "Winner",
            "map" : 0,
            "something" : [ 
                {
                    "something" : "test"
                }
            ]
        }, 
        {
            "name" : "Winner",
            "map" : 2,
            "something" : []
        }, 
        {
            "name" : "DifferentName",
            "map" : 2,
            "something" : []
        }
    ]
}

这是错误的,因为 "something" : "test" 应该在第二个元素中,其中 map 等于 2。

如果我将字段 "name" 更改为 "a" 并运行相同的更新,那么我会得到正确的结果:

{
    "_id" : ObjectId("5b673f525ef92ec6ef16504e"),
    "events" : [ 
        {
            "a" : "Winner",
            "map" : 0,
            "something" : []
        }, 
        {
            "a" : "Winner",
            "map" : 2,
            "something" : [ 
                {
                    "something" : "test"
                }
            ]
        }, 
        {
            "a" : "DifferentName",
            "map" : 2,
            "something" : []
        }
    ]
}

现在您可以看到,"something" : "test" 位于正确的位置(第二个事件)。这是因为我使用了 "name""name" 是 Mongo 中的某种保留关键字吗?

【问题讨论】:

    标签: node.js mongodb mongodb-query


    【解决方案1】:

    当数组中有多个条件要匹配时,.Dot 表示法不适用于更新查询。

    您需要使用$elemMatch 来匹配数组中的两个字段

    db.getCollection('test').updateOne(
      {
        "_id": ObjectId("5b673f525ef92ec6ef16504e"),
        "events": { "$elemMatch": { "name": "Winner", "map": 2 }}
      },
      {
        "$push": { "events.$.something": { "something": "test" }}
      }
    )
    

    【讨论】:

      猜你喜欢
      • 2013-12-26
      • 1970-01-01
      • 1970-01-01
      • 2017-10-23
      • 1970-01-01
      • 2015-01-28
      • 1970-01-01
      • 2020-03-18
      • 1970-01-01
      相关资源
      最近更新 更多