sql >> Database >  >> NoSQL >> MongoDB

Hoe een query te construeren om het geneste array-document in Mongo bij te werken?

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.




  1. Kan het dbpath in mongodb niet wijzigen via mongodb.conf

  2. Hoe het n-de element van de array in mongodb te verwijderen

  3. Wat is Mongoose-fout Gegoten naar ObjectId mislukt voor waarde XXX op pad _id?

  4. Mongo-query in python als ik variabele als waarde gebruik