Gezien je reactie ben je op de goede weg. Zoals u weet, is de positionele $
operator is gewoon een "waarde" container, die de index . heeft van het eerste array-element dat overeenkomt met uw zoekopdracht.
Je 'zou' gebruik dat als je absoluut . was zorg ervoor dat uw twee arrays altijd hetzelfde aantal elementen bevatte en dat deze corresponderende items altijd op dezelfde positie stonden.
Dus ja, om veilig te zijn, gebruik $elemMatch met twee update operaties zoals zo
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'
}
})
De enige echte overweging hier is dat het vanwege de twee updates mogelijk is dat een lees van het document zou optreden tussen die updates en uw _searchData
en _children
documenten zouden niet dezelfde overeenkomstige . hebben vermeldingen in de addressesR
arrays.
Hetzelfde geldt voor replicatie, aangezien beide bewerkingen moeten worden opnieuw afgespeeld door de secundaire knooppunten.
Wat een leuke functie zou zijn, zou zijn om $elemMatch te kunnen gebruiken in de update onderdeel van uw vraag. Op die manier zou je vragen naar de positie van het element aan die kant. Maar dit bestaat nog niet . Maar vanaf 2.6 kun je mag doe zoiets als dit:
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"
}
}
}
]
})
Dat wordt behandeld in de handleiding onder Bulk Update .