MongoDB
 sql >> Base de Dados >  >> NoSQL >> MongoDB

Como construir uma consulta para atualizar o documento de matriz aninhada no mongo?


O operador posicional não funciona no número de níveis em que você está tentando fazê-lo funcionar ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. issuetabpanels%3Acomment-tabpanel ) com menus.$.items.$.name e mesmo que tivesse, o analisador de consultas MongoDB não teria ideia do que o outro $ é do find da update .

Você precisará retirar os itens do esquema, atualizá-los separadamente e, em seguida, atualizar o documento raiz.

Uma boa maneira de julgar quando as consultas devem ser feitas separadamente é pensar que cada menu soa como uma entidade separada (ou tabela em um banco de dados relacional), como tal, você provavelmente deve trabalhar na atualização dessas entidades (ou tabelas em um modelo relacional) separadamente para a entidade-mãe (tabela).

Então, primeiro você obteria o documento raiz principal. Role pelos menus no lado do cliente e, em seguida, $set esse menu específico para todo o item que você cria no lado do cliente.

Editar


A maneira como imagino esse trabalho do lado do cliente é (em pseudocódigo, pois meu Java está um pouco enferrujado) primeiro obtendo esse documento em um modo de registro ativo:
doc = db.col.find({ "_id" : { "$oid" : "506e9e54a4e8f51423679428"} , 
    "menus._id" : { "$oid" : "506e9e5aa4e8f51423679429"}});

Em seguida, você percorreria o documento atribuindo seus valores:
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, em seguida, salve o documento depois que todas as alterações forem confirmadas:
db.col.save(doc);

É claro que esta é apenas uma maneira de fazê-lo e desta forma usa o paradigma activen record que eu pessoalmente gosto. Nesta ideia, você combinaria o find com tudo o mais que precisasse modificar no documento, construindo-o no lado do cliente e enviando tudo como uma única consulta ao seu banco de dados.