MongoDB
 sql >> Base de données >  >> NoSQL >> MongoDB

Le $ positionnel travaille-t-il sur différentes parties du même document ?

Compte tenu de votre commentaire, vous semblez être sur la bonne voie. Comme vous le savez, le positionnel $ L'opérateur est juste un conteneur "valeur", qui a l'index du premier élément de tableau correspondant à votre requête.

Vous "pourriez" utilisez-le si vous étiez absolument assurez-vous que vos deux tableaux toujours contenait le même nombre d'éléments et que ces entrées correspondantes étaient toujours à la même position.

Alors oui, pour être sûr, utilisez $elemMatch avec deux opérations de mise à jour comme ça

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 seule véritable considération ici est que grâce aux deux mises à jour, c'est possible qu'un lu du document pourrait se produire entre ces mises à jour et votre _searchData et _children les documents n'auraient pas le même correspondant entrées dans les addressesR tableaux.

La même chose s'applique à la réplication, car les deux opérations doivent être rejouées par les nœuds secondaires.

Ce qui serait une fonctionnalité intéressante, serait de pouvoir utiliser $elemMatch dans la mise à jour partie de votre requête. De cette façon, vous demanderiez la position de l'élément de ce côté. Mais cela n'existe pas encore . Mais à partir de la version 2.6, vous pouvez faites quelque chose comme ceci :

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

    ]
})

Cela est couvert dans la page de manuel sous Mise à jour en masse .