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 .