Ето големият въпрос, трябва ли да използвате операциите „addToSet“ и „push“ на Mongo? Ако наистина планирате да модифицирате само отделни елементи в масива, тогава вероятно трябва да изградите тези масиви като обекти.
Ето как бих структурирал това:
{
id: 1,
items:
{
"2" : { "blocks" : { "3" : { txt : 'hello' } } },
"5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
}
}
Това основно трансформира всичко в JSON обекти вместо масиви. Губите възможността да използвате $push
и $addToSet
но мисля, че това прави всичко по-лесно. Например, вашата заявка ще изглежда така:
db.objects.update({'items.2':{$exists:true} }, {'$set':{'items.2.blocks.0.txt':'hi'}})код>
Ще забележите също, че съм изхвърлил "идентификаторите". Когато влагате неща като това, обикновено можете да замените "ID" с просто използване на това число като индекс. Концепцията "ID" вече се подразбира.
Тази функция е добавена в 3.6 с изразителни актуализации.
db.objects.update( {id:1 }, { $set:{ 'items.$[itm].blocks.$[blk].txt':"здравей", } }, { multi:false, arrayFilters:[ { 'itm.id':2 }, { 'blk.id':3} ] } )