How to Update Multiple Array Elements in mongodb

ghz 1years ago ⋅ 8560 views

Question

I have a Mongo document which holds an array of elements.

I'd like to reset the .handled attribute of all objects in the array where .profile = XX.

The document is in the following form:

{
    "_id": ObjectId("4d2d8deff4e6c1d71fc29a07"),
    "user_id": "714638ba-2e08-2168-2b99-00002f3d43c0",
    "events": [{
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 10,
            "data": "....."
        } {
            "handled": 1,
            "profile": 20,
            "data": "....."
        }
        ...
    ]
}

so, I tried the following:

.update({"events.profile":10},{$set:{"events.$.handled":0}},false,true)

However it updates only the first matched array element in each document. (That's the defined behaviour for [$ - the positional operator](http://www.mongodb.org/display/DOCS/Updating#Updating- The%24positionaloperator).)

How can I update all matched array elements?


Answer

UPDATE: As of Mongo version 3.6, this answer is no longer valid as the mentioned issue was fixed and there are ways to achieve this. Please check other answers.


At this moment it is not possible to use the positional operator to update all items in an array. See JIRA http://jira.mongodb.org/browse/SERVER-1243

As a work around you can:

  • Update each item individually (events.0.handled events.1.handled ...) or...
  • Read the document, do the edits manually and save it replacing the older one (check "Update if Current" if you want to ensure atomic updates)