Actualización de matrices anidadas en mongoDB a través de mongo shell

Lo que sigue es un documento de MongoDB:

{ "_id" : 2, "mem_id" : M002, "email" : "xyz@gmail.com", "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 } ] } ] } ] } 

No puedo actualizar los campos de tipo array, especialmente event_type, idioma, género y elenco debido a la anidación. Básicamente, quería actualizar los cuatro campos mencionados junto con el campo de conteo para cada uno y subdocumentos. La instrucción de actualización debe insertar un valor en el árbol si el valor es nuevo, sino que debe incrementar el conteo para ese valor.
¿Cuál puede ser la consulta en mongo shell? Gracias

Estás golpeando directamente una de las limitaciones actuales de MongoDB. El problema es que el motor no admite varios operadores posicionales. Ver este uso múltiple del operador posicional `$` para actualizar matrices anidadas

Hay un boleto abierto para esto: https://jira.mongodb.org/browse/SERVER-831 (mencionado también allí)

También puede leer este sobre cómo cambiar su modelo de datos: Actualización de matrices anidadas en mongodb

Si es factible para usted, puede hacer:

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

Pero no puedes hacer:

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

Tomemos caso por caso:

  1. Para actualizar el nombre del campo en event_type array:

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

Este comando actualizará el nombre de un objeto dentro de la lista event_type, a GMT desde 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.Para actualizar campos dentro de event_type, como idioma, género que son lista interna: No hay consulta directa para esto. Necesita leer el documento, actualizar ese documento usando el JavaScript o el idioma de su elección, y luego guardar () el mismo. No creo que haya otra forma disponible hasta mongo 2.4

Para obtener más documentación, puede consultar guardar () .

¡Gracias!