Atualizando matrizes aninhadas no mongoDB via shell mongo

A seguir, um documento do 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 } ] } ] } ] } 

Não consigo atualizar campos que são do tipo array, especialmente event_type, language, genre e cast por causa do aninhamento. Basicamente, eu queria atualizar todos os quatro campos mencionados junto com o campo de contagem para cada um e subdocumentos. A instrução de atualização deve inserir um valor para a tree, se o valor for novo, deve incrementar a contagem para esse valor.
Qual pode ser a consulta no shell mongo? obrigado

Você está atingindo diretamente uma das limitações atuais do MongoDB. O problema é que o mecanismo não suporta vários operadores posicionais. Veja este uso múltiplo do operador `$` posicional para atualizar matrizes aninhadas

Há um ticket aberto para isso: https://jira.mongodb.org/browse/SERVER-831 (mencionado também lá)

Você também pode ler este aqui sobre como alterar seu modelo de dados: Atualizando matrizes aninhadas no mongodb

Se for viável para você, você pode fazer:

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

Mas você não pode fazer:

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

Vamos tomar caso por caso:

  1. Para atualizar o nome do campo na matriz event_type:

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

Este comando irá atualizar o nome de um object dentro da lista event_type, para 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.Para atualizar campos dentro de event_type, como idioma, gênero que é lista interna: Não há consulta direta para isso. Você precisa ler o documento, atualizar esse documento usando o JavaScript ou o idioma de sua escolha e, em seguida, salvar () o mesmo. Eu não acho que haja outro meio disponível até o mongo 2.4

Para documentação adicional, você pode consultar save () .

Obrigado!