4

I have a MongoDB collection which has documents which look like this:

{
    createdTimestamp: 111111111111,
    items: [{
        itemName: 'Name 1',
        quantity: 10
    }, {
        itemName: 'Name 2'
        quantity: 20
    }]
}

Now, I want to update all documents so that itemName: 'Name 1' would be updated to itemName: 'New Name'. After an update, the above document should look like as below:

{
    createdTimestamp: 111111111111,
    items: [{
        itemName: 'New Name',
        quantity: 10
    }, {
        itemName: 'Name 2'
        quantity: 20
    }]
}

Is there any way to do this, without iterating over all documents myself?

2 Answers 2

7

You need to use $ positional operator to update an array element and with multi: true option you can update multiple document with the same match

db.collection.update(
  { 'items': { '$elemMatch': { 'itemName': 'Name 1' }}},
  { '$set': { 'items.$.itemName': 'New Name' }},
  { 'multi': true }
)

and with the mongodb 3.6 arrayFilters

db.collection.update(
  { 'items': { '$elemMatch': { 'itemName': 'Name 1' }}},
  { '$set': { 'items.$[item].itemName': 'New Name' }},
  { 'arrayFilter': [{ 'item.itemName': 'Name 1' }], 'multi': true }
)
Sign up to request clarification or add additional context in comments.

1 Comment

It worked. Had to do a small change: '$elemMatch': {itemName: 'Name 1'}
1

you can use mongoDb arrayFilters

db.collection.update(
  { },
  { "$set": { "items.$[elem].itemName": 'new Name' } },
  { "arrayFilters": [{ "elem.itemName": 'Name 1' }], "multi": true }
)

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.