0

I have a document with the following fields:

{
  "_id": 1,
  "codes": [
    {"name": "code1", "active": null, "disabled": false},
    {"name": "code2", "active": null, "disabled": false},
    {"name": "code3", "active": null, "disabled": false},
    {"name": "code4", "active": null, "disabled": false},
    {"name": "code5", "active": null, "disabled": false},
    {"name": "code6", "active": null, "disabled": false}
  ]
}

Is there any way to update just the objects that have the name value equal to "code2", "code3" and "code4"?

For example:

db.collection.update(
  {"_id": 1},
  {
    $set: {
      "codes": [
        {"name": "code2", "active": false, "disabled": true},
        {"name": "code3", "active": true, "disabled": false},
        {"name": "code4", "active": null, "disabled": true}
      ]
    }
  }
)

Expected result:

{
  "_id": 1,
  "codes": [
    {"name": "code1", "active": null, "disabled": false},
    {"name": "code2", "active": false, "disabled": true},
    {"name": "code3", "active": true, "disabled": false},
    {"name": "code4", "active": null, "disabled": true},
    {"name": "code5", "active": null, "disabled": false},
    {"name": "code6", "active": null, "disabled": false}
  ]
}

Actual result:

{
  "_id": 1,
  "codes": [
    {"name": "code2", "active": false, "disabled": true},
    {"name": "code3", "active": true, "disabled": false},
    {"name": "code4", "active": null, "disabled": true}
  ]
}

2 Answers 2

1

You cannot achieve this in one query, however you can loop on your array of updates, and perform updates for element matching condition in codes array :

var updatesArray = [
    {"name": "code2", "active": false, "disabled": true},
    {"name": "code3", "active": true, "disabled": false},
    {"name": "code4", "active": null, "disabled": true}
  ]

updatesArray.forEach(function(newCode){
  db.getCollection("collection").update(
    {_id:1},   
    {$set:{
      "codes.$[subcode].active":newCode.active,
      "codes.$[subcode].disabled":newCode.disabled}
    },   
    { multi: true,
       arrayFilters: [ { "subcode.name": newCode.name } ]
    }
  )
})
Sign up to request clarification or add additional context in comments.

1 Comment

That would get really slow if there is a large number of elements that need to be updated
0

Use this command to achieve

db.collection.update(  {
   "_id": 1,
   "codes.name":{$in:{"code2","code3","code4"}}
},{$set:{"codes.$.active":true}})

1 Comment

Using this would set active to true in all of those 3 objects, which does not meet the expected result because each of the updated objects have different values for the active and disabled properties.

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.