Problemet är att du inte kan använda $
operatorn för att visa matchning på kapslade nivåer i en array. Och viktigast av allt kan du bara ange en gång.
Som framgår av dokumentationen
, är att $
kommer endast matcha den första element hittades. Det inte bara betyder att om du hade flera matchningar för din fråga så skulle bara den första väljas, det betyder också att endast den första matchade arrayposition kommer att användas. Det betyder att något sådant här inte heller skulle fungera:
{ $set: { '_children.addressesR.1._children.configId.a._children.$.b': 30 }
Eftersom det felaktigt skulle matcha index
1
värdera och uppdatera ett objekt du inte förväntade dig.
Om du möjligen kunde uppdatera hela array då skulle följande fungera:
{ $set: {"_children.addressesR.$._children.configId.a._children": [ { b: 10}, { b: 30} ] } }
Det är som jag sa, eftersom index
matchar för den första array.
Men med tanke på den struktur du har, verkar det som att ditt bästa alternativ är att ändra den översta nivån till ett underdokument istället. Såvida detta inte i verkligheten har en anledning att vara en array, snarare än de två blandade dokumenttyper som det verkar vara nu.