De positionele operator werkt niet op het aantal niveaus waarop u het probeert te laten werken ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanels%3Acomment-tabpanel
) met menus.$.items.$.name
en zelfs als dat zo zou zijn, zou de MongoDB-queryparser geen idee hebben wat de andere $
is van de find
van de update
.
U moet de items uit het schema halen, dat apart bijwerken en vervolgens het hoofddocument bijwerken.
Een goede manier om te beoordelen wanneer query's afzonderlijk moeten worden uitgevoerd, is te denken dat elk menu klinkt als een afzonderlijke entiteit (of tabel in een relationele database). Als zodanig moet u waarschijnlijk werken aan het afzonderlijk bijwerken van die entiteiten (of tabellen in een relationeel model) om de bovenliggende entiteit (tabel).
Dus eerst zou je het hoofdrootdocument eruit halen. Blader door de menu's aan de clientzijde en vervolgens $set
dat specifieke menu naar het hele item dat u aan de klantzijde bouwt.
Bewerken
De manier waarop ik me deze werkclientzijde voorstel (in pseudo-code omdat mijn Java een beetje roestig is) door eerst dat document op een actieve recordmanier te krijgen:
doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} ,
"menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});
Vervolgens herhaalt u het document waarin u uw waarden toewijst:
foreach(doc.menus as menu_key => menu){
foreach(menu['items'] as key => item){
if(item._id == { "$oid" : "506e9f07a4e8f5142367942f"}){
doc.menus[menu_key][key][name] = "xcvxc66666"
}
}
}
En sla het document vervolgens eenvoudig op nadat alle wijzigingen zijn doorgevoerd:
db.col.save(doc);
Dit is natuurlijk maar één manier om het te doen en deze manier maakt gebruik van het activen record paradigma dat ik persoonlijk leuk vind. In dit idee zou je de vondst combineren met al het andere dat je in het document moet wijzigen, het aan de clientzijde opbouwen en het dan allemaal als één enkele query naar je database sturen.