Oto ważne pytanie, czy musisz wykorzystać operacje „addToSet” i „push” Mongo? Jeśli naprawdę planujesz modyfikować tylko pojedyncze elementy w tablicy, prawdopodobnie powinieneś zbudować te tablice jako obiekty.
Oto, jak bym to zorganizował:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
To zasadniczo przekształca wszystko w obiekty JSON zamiast w tablice. Tracisz możliwość używania $push
i $addToSet
ale myślę, że to wszystko ułatwia. Na przykład Twoje zapytanie wyglądałoby tak:
db.objects.update({'items.2':{$exists:true} }, {'$set':{'items.2.blocks.0.txt':'hi'}})
Zauważysz również, że porzuciłem „dowody”. Kiedy zagnieżdżasz takie rzeczy, zazwyczaj możesz zastąpić "ID" używając po prostu tej liczby jako indeksu. Koncepcja „ID” jest teraz sugerowana.
Ta funkcja została dodana w wersji 3.6 z ekspresyjnymi aktualizacjami.
db.objects.update( {id:1 }, { $set:{ 'items.$[itm].blocks.$[blk].txt':"hi", } }, { multi:false, arrayFilters:[ { 'itm.id':2 }, { 'blk.id':3} ] } )