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

¿$ posicional trabajando en diferentes partes del mismo documento?

Teniendo en cuenta tu comentario, parece que estás en el camino correcto. Como sabe, el posicional $ operador es solo un contenedor de "valor", que tiene el índice del primer elemento de la matriz que coincidió con su consulta.

Usted "podría" usa eso si fueras absolutamente asegúrese de que sus dos matrices siempre contenía el mismo número de elementos y que estas entradas correspondientes estaban en la misma posición en todo momento.

Entonces sí, para estar seguro, use $elemMatch con dos operaciones de actualización así

db.p.update( { '$and': [ 
  { '_searchData.addressesR': {$elemMatch: { 'street': 'BITTON' } } ] },
  { '$set': {
    '_searchData.addressesR.$.street':'BITTON CHANGED' ,
  }
})

db.p.update( { '$and': [ 
  { '_children.addressesR': {$elemMatch: { 'street': 'Bitton' } } ] },
  { '$set': {
    '_children.addressesR.$.street': 'Bitton CHANGED'
  }
})

La única consideración real aquí es debido a las dos actualizaciones que es posible que un leído del documento podría ocurren entre esas actualizaciones y sus _searchData y _children los documentos no tendrían el mismo correspondiente entradas en addressesR matrices.

Lo mismo se aplica con la replicación, ya que ambas operaciones tienen que ser reproducidas por los nodos secundarios.

Lo que sería una buena característica sería poder usar $elemMatch en la actualización parte de su consulta. De esa forma estarías consultando la posición del elemento en ese lado. Pero esto no existe todavía . Pero desde 2.6 hacia arriba puedes haz algo como esto:

db.runCommand({

    "update": "p",

    "updates": [
        { 
            "q": { '_children.addressesR': {$elemMatch: { 'street': 'Bitton' } },

            "u": { 
                "$set": {
                    "_children.addressesR.$.street": "Bitton CHANGED"
                }
            }
        },
        { 
            "q": { '_searchData.addressesR': {$elemMatch: { 'street': 'BITTON' } },

            "u": { 
                "$set": {
                    "_searchData.addressesR.$.street": "BITTON CHANGED"
                }
            }
        }

    ]
})

Eso está cubierto en la página del manual bajo Actualización masiva .