Positionsoperatoren virker ikke på det antal niveauer, du forsøger at få den til at virke på ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanels%3Acomment-tabpanel
) med menus.$.items.$.name
og selv hvis det gjorde, ville MongoDB-forespørgselsparseren ikke have nogen idé om, hvad den anden $
er fra find
af update
.
Du bliver nødt til at trække elementerne ud fra skemaet, opdatere det separat og derefter opdatere roddokumentet.
En god måde at bedømme, hvornår forespørgsler skal udføres separat, er at tænke, at hver menu lyder som en separat enhed (eller tabel i en relationsdatabase), og derfor bør du nok arbejde på at opdatere disse entiteter (eller tabeller i en relationsmodel) separat til den overordnede enhed (tabel).
Så først ville du få det primære roddokument ud. Rul hen over dens menuer på klientsiden og derefter $set
den pågældende menu til hele det element, du bygger på klientsiden.
Rediger
Den måde jeg forestiller mig denne arbejdsklientside er (i pseudokode, da min Java er lidt rusten) ved først at få det dokument på en aktiv rekordmåde:
doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} ,
"menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});
Derefter vil du gentage dokumentet og tildele dine værdier:
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"
}
}
}
Og gem derefter dokumentet, når alle ændringer er foretaget:
db.col.save(doc);
Dette er selvfølgelig kun en måde at gøre det på og på denne måde bruger Activn Record paradigmet, som jeg personligt godt kan lide. I denne idé ville du kombinere fundet med alt andet, du har brug for at ændre på dokumentet, bygge det op på klientsiden og derefter sende det hele ned som en enkelt forespørgsel til din DB.