MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Come costruire una query per aggiornare il documento dell'array nidificato in mongo?

L'operatore posizionale non funziona sul numero di livelli su cui stai cercando di farlo funzionare ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanel%3Acomment-tabpanel ) con menus.$.items.$.name e anche se lo facesse, il parser di query MongoDB non avrebbe idea di cosa fosse l'altro $ proviene da find dell'update .

Dovrai estrarre gli elementi dallo schema, aggiornarli separatamente e quindi aggiornare il documento radice.

Un buon modo per giudicare quando le query devono essere eseguite separatamente è pensare che ogni menu suoni come un'entità separata (o tabella in un database relazionale), in quanto tale dovresti probabilmente lavorare sull'aggiornamento di tali entità (o tabelle in un modello relazionale) separatamente per l'entità padre (tabella).

Quindi prima dovresti estrarre il documento principale principale. Scorri i suoi menu sul lato client e poi $set quel particolare menu all'intero elemento che crei sul lato client.

Modifica

Il modo in cui immagino questo lato client di lavoro è (in pseudocodice poiché il mio Java è un po' arrugginito) ottenendo prima quel documento in modo record attivo:

doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} , 
    "menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});

Quindi scorreresti il ​​documento assegnando i tuoi valori:

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"
        }
    }
}

E poi salva semplicemente il documento dopo che tutte le modifiche sono state confermate:

db.col.save(doc);

Questo è ovviamente solo un modo per farlo e in questo modo usa il paradigma activen record che personalmente mi piace. In questa idea dovresti combinare la ricerca con tutto ciò che è necessario modificare sul documento, costruendolo lato client e quindi inviando tutto come una singola query al tuo DB.