Dit is de grote vraag, moet je gebruik maken van Mongo's "addToSet" en "push" operaties? Als je echt van plan bent om alleen individuele items in de array te wijzigen, dan zou je deze arrays waarschijnlijk als objecten moeten bouwen.
Hier is hoe ik dit zou structureren:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
Dit transformeert in feite alles in JSON-objecten in plaats van arrays. U verliest de mogelijkheid om $push
te gebruiken en $addToSet
maar ik denk dat dit alles makkelijker maakt. Uw zoekopdracht ziet er bijvoorbeeld als volgt uit:
db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})
Je zult ook merken dat ik de "ID's" heb gedumpt. Als je dit soort dingen nest, kun je 'ID' over het algemeen vervangen door dat nummer gewoon als index te gebruiken. Het "ID"-concept wordt nu geïmpliceerd.
Deze functie is toegevoegd in 3.6 met expressieve updates.
db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )