Zde je velká otázka, potřebujete využít operace Mongo „addToSet“ a „push“? Pokud skutečně plánujete upravit pouze jednotlivé položky v poli, pak byste pravděpodobně měli tato pole sestavit jako objekty.
Zde je návod, jak bych to strukturoval:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
To v podstatě transformuje vše na objekty JSON namísto polí. Ztratíte možnost používat $push
a $addToSet
ale myslím, že to všechno usnadňuje. Váš dotaz bude vypadat například takto:
db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})
Také si všimnete, že jsem vyhodil „ID“. Když vnořujete věci, jako je toto, můžete obecně nahradit „ID“ pouhým použitím tohoto čísla jako indexu. Koncept "ID" je nyní implikován.
Tato funkce byla přidána ve verzi 3.6 s výraznými aktualizacemi.
db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )