How to Update Multiple Array Elements in mongodb

LiorH picture LiorH · Jan 12, 2011 · Viewed 124.9k times · Source

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.)

How can I update all matched array elements?

Answer

Javier Ferrero picture Javier Ferrero · Jan 12, 2011

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)