Update array with multiple conditions in mongodb

旧巷老猫 提交于 2019-12-18 09:27:07

问题


I have this document:

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

If I run the following update:

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

I get the bad result:

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

This is wrong, because "something" : "test" should be in the second element, where the map is equal to 2.

If I change the field "name" to "a" and run the same update, then I get the right result:

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

Now you can see, that "something" : "test" is in the right place (second event). Is this because I have used "name" and "name" is some kind of reserved keyword in Mongo?


回答1:


When there are multiple conditions to match inside an array then the .Dot notation doesn't work with update query.

You need to use $elemMatch to match exact two fields inside an array

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


来源:https://stackoverflow.com/questions/51697951/update-array-with-multiple-conditions-in-mongodb

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!