Aggiornamento di matrici annidate in mongoDB tramite mongo shell

Di seguito è riportato un documento MongoDB:

{ "_id" : 2, "mem_id" : M002, "email" : "[email protected]", "event_type" : [ { "name" : "MT", "count" : 1, "language" : [ { "name" : "English", "count" : 1, "genre" : [ { "name" : "Action", "count" : 6 }, { "name" : "Sci-Fi", "count" : 3 } ], "cast" : [ { "name" : "Sam Wortington", "count" : 2 }, { "name" : "Bruce Willis", "count" : 4 }, { "name" : "Will Smith", "count" : 7 }, { "name" : "Irfan Khan", "count" : 1 } ] } ] } ] } 

Non sono in grado di aggiornare campi di tipo array, specialmente event_type, lingua, genere e cast a causa del nesting. Fondamentalmente, volevo aggiornare tutti e quattro i campi menzionati insieme al campo count per ogni documento e sottodocument. L’istruzione di aggiornamento dovrebbe inserire un valore nell’albero se il valore è nuovo altrimenti dovrebbe incrementare il conteggio per quel valore.
Quale può essere la query nella shell di mongo? Grazie

Stai colpendo direttamente uno degli attuali limiti di MongoDB. Il problema è che il motore non supporta diversi operatori posizionali. Vedi questo Uso multiplo dell’operatore di posizione `$` per aggiornare gli array annidati

C’è un biglietto aperto per questo: https://jira.mongodb.org/browse/SERVER-831 (menzionato anche lì)

Puoi anche leggere questo su come modificare il tuo modello di dati: Aggiornamento di matrici nested in mongodb

Se è fattibile per te, puoi fare:

 db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.0.language.$.count":}}) db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.0.count":}}) 

Ma non puoi fare:

 db.collection.update({_id:2,"event_type.name":'MT' ,"event_type.language.name":'English'},{$set:{"event_type.$.language.$.count":}}) 

Prendiamo caso per caso:

  1. Per aggiornare il nome del campo nell’array event_type:

    db.testnested.update ({“event_type.name”: “MT”}, {$ set: {“event_type.name”: “GMT”}})

Questo comando aggiornerà il nome per un object all’interno dell’elenco event_type, a GMT da MT:

 BEFORE: db.testnested.find({}, {"event_type.name" : 1}) { "_id" : 2, "event_type" : [ { "name" : "MT" } ] } AFTER: db.testnested.find({}, {"event_type.name" : 1}) { "_id" : 2, "event_type" : [ { "name" : "GMT" } ] } 

2.Per aggiornare i campi all’interno di event_type, ad esempio lingua, genere che è la lista interna: non esiste una query diretta per questo. Devi leggere il documento, aggiornare quel documento usando il linguaggio JavaScript o la tua scelta, e quindi salvare () lo stesso. Non penso che ci sia un altro modo disponibile fino a mongo 2.4

Per ulteriore documentazione, è ansible fare riferimento a save () .

Grazie!