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

Actualización de matrices anidadas en mongodb

Aquí está la gran pregunta:¿necesita aprovechar las operaciones "addToSet" y "push" de Mongo? Si realmente planea modificar solo elementos individuales en la matriz, entonces probablemente debería construir estas matrices como objetos.

Así es como estructuraría esto:

{
    id: 1,
    items: 
        { 
          "2" : { "blocks" : { "3" : { txt : 'hello' } } },
          "5" : { "blocks" : { "1" : { txt : 'foo'}, "2" : { txt : 'bar'} } }
        }
}

Básicamente, esto transforma todo en objetos JSON en lugar de matrices. Pierdes la habilidad de usar $push y $addToSet pero creo que esto hace que todo sea más fácil. Por ejemplo, su consulta se vería así:

db.objects.update({'items.2': {$exists:true} }, {'$set': {'items.2.blocks.0.txt': 'hi'}})

También notará que he descargado las "identificaciones". Cuando anida cosas como esta, generalmente puede reemplazar "ID" simplemente usando ese número como índice. El concepto "ID" ahora está implícito.

Esta característica se agregó en 3.6 con actualizaciones expresivas.

db.objects.update( {id: 1 }, { $set: { 'items.$[itm].blocks.$[blk].txt': "hi", } }, { multi: false, arrayFilters: [ { 'itm.id': 2 }, { 'blk.id': 3} ] } )