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}
]
}
asked Feb 28, 2019 at 13:04
Valip
4,66025 gold badges91 silver badges157 bronze badges
2 Answers 2
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 } ]
}
)
})
answered Feb 28, 2019 at 13:43
matthPen
4,3731 gold badge18 silver badges18 bronze badges
Sign up to request clarification or add additional context in comments.
1 Comment
Valip
That would get really slow if there is a large number of elements that need to be updated
Use this command to achieve
db.collection.update( {
"_id": 1,
"codes.name":{$in:{"code2","code3","code4"}}
},{$set:{"codes.$.active":true}})
1 Comment
Valip
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.lang-js