Her er det store spørgsmål, skal du udnytte Mongos "addToSet" og "push" operationer? Hvis du virkelig planlægger kun at ændre individuelle elementer i arrayet, bør du sandsynligvis bygge disse arrays som objekter.
Sådan vil jeg strukturere dette:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
Dette transformerer dybest set alt til JSON-objekter i stedet for arrays. Du mister muligheden for at bruge $push
og $addToSet
men jeg tror det gør alting nemmere. For eksempel vil din forespørgsel se sådan ud:
db.objects.update({'items.2':{$exists:true} }, {'$set':{'items.2.blocks.0.txt':'hej'}})
Du vil også bemærke, at jeg har dumpet "ID'erne". Når du indlejrer ting som dette, kan du generelt erstatte "ID" med blot at bruge det nummer som et indeks. "ID"-konceptet er nu underforstået.
Denne funktion er blevet tilføjet i 3.6 med udtryksfulde opdateringer.
db.objects.update( {id:1 }, { $set:{ 'items.$[itm].blocks.$[blk].txt':"hej", } }, { multi:false, arrayFilters:[ { 'itm.id':2 }, { 'blk.id':3} ] } )