MongoDB
 sql >> Database >  >> NoSQL >> MongoDB

Posizionale $ lavorando su parti diverse dello stesso documento?

Considerando il tuo commento sembri essere sulla strada giusta. Come saprai, il posizionale $ l'operatore è solo un contenitore di "valore", che ha l'indice del primo elemento dell'array corrispondente nella tua query.

Tu "potresti" usalo se fossi assolutamente assicurati che i tuoi due array sempre conteneva lo stesso numero di elementi e che queste voci corrispondenti erano sempre nella stessa posizione.

Quindi sì, per sicurezza, usa $elemMatch con due operazioni di aggiornamento in questo modo

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'
  }
})

L'unica vera considerazione qui è che grazie ai due aggiornamenti è possibile che una lettura del documento potrebbe si verificano tra questi aggiornamenti e il tuo _searchData e _children i documenti non avrebbero la stessa corrispondente voci in addressesR matrici.

La stessa cosa vale per la replica, poiché entrambe le operazioni devono essere riprodotte dai nodi secondari.

Sarebbe una bella caratteristica poter usare $elemMatch nell'aggiornamento parte della tua domanda. In questo modo cercherai la posizione dell'elemento su quel lato. Ma questo non esiste ancora . Ma da 2,6 in su puoi fai qualcosa del genere:

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

    ]
})

Questo è trattato nella pagina del manuale in Aggiornamento collettivo .