Med tanke på din kommentar verkar du vara på rätt väg. Som du är medveten om är positionella $
operatorn är bara en "värde"-behållare, som har index av det första matriselementet som matchades i din fråga.
Du "kunde" använd det om du var absolut se till att dina två arrayer alltid innehöll samma antal element och att dessa motsvarande poster var i samma position hela tiden.
Så ja, för att vara säker, använd $elemMatch med två uppdatera operationer som så
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'
}
})
Det enda verkliga övervägandet här är på grund av de två uppdateringarna som det är möjligt att en läs av dokumentet kunde inträffar mellan dessa uppdateringar och din _searchData
och _children
dokument skulle inte ha samma motsvarande poster i addressesR
arrayer.
Samma sak gäller med replikering, eftersom båda operationerna måste spelas om av de sekundära noderna.
Vad som skulle vara en trevlig funktion skulle vara att kunna använda $elemMatch i uppdateringen en del av din fråga. På det sättet skulle du fråga efter elementets position på den sidan. Men det här finns inte ännu . Men från 2,6 och uppåt kan gör något så här:
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"
}
}
}
]
})
Detta beskrivs i manualsidan under Massuppdatering .