简体   繁体   中英

MongoDb update multiple objects from array

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}
  ]
}

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 } ]
    }
  )
})

Use this command to achieve

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM