sql >> Base de Datos >  >> NoSQL >> MongoDB

¿Cómo construir una consulta para actualizar el documento de matriz anidada en mongo?

El operador posicional no funciona en la cantidad de niveles en los que intenta que funcione ( https://jira.mongodb.org/browse/SERVER-831?focusedCommentId=22438&page=com.atlassian.jira.plugin.system. tematabpanels%3Uncomentario-tabpanel ) con menus.$.items.$.name e incluso si lo hiciera, el analizador de consultas de MongoDB no tendría idea de qué otro $ es de find de la update .

Deberá extraer los elementos del esquema, actualizarlos por separado y luego actualizar el documento raíz.

Una buena manera de juzgar cuándo las consultas se deben realizar por separado es pensar que cada menú suena como una entidad separada (o tabla en una base de datos relacional), por lo que probablemente debería trabajar en la actualización de esas entidades (o tablas en un modelo relacional) por separado para la entidad padre (tabla).

Entonces, primero obtendría el documento raíz principal. Desplácese por sus menús en el lado del cliente y luego $set ese menú en particular a todo el elemento que creas en el lado del cliente.

Editar

La forma en que imagino este lado del cliente de trabajo es (en pseudocódigo ya que mi Java está un poco oxidado) obteniendo primero ese documento en forma de registro activo:

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

Luego, iterarías a través del documento asignando tus 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"
        }
    }
}

Y luego simplemente guarde el documento después de confirmar todos los cambios:

db.col.save(doc);

Por supuesto, esta es solo una forma de hacerlo y de esta manera utiliza el paradigma de registro activo que personalmente me gusta. En esta idea, combinaría la búsqueda con todo lo demás que necesita modificar en el documento, construyéndolo del lado del cliente y luego enviándolo todo como una sola consulta a su base de datos.