Vzhledem k vašemu komentáři se zdá, že jste na správné cestě. Jak víte, poziční $
operátor je pouze "hodnotový" kontejner, který má index prvního prvku pole nalezeného ve vašem dotazu.
"mohli" použijte to, pokud jste byli naprosto ujistěte se, že vaše dvě pole vždy obsahovaly stejný počet prvků a že tyto odpovídající položky byly vždy na stejné pozici.
Takže ano, abyste byli v bezpečí, použijte $elemMatch s dvěma aktualizovat operace jako tak
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'
}
})
Jediná skutečná úvaha je zde kvůli dvěma aktualizacím možná že čtení dokumentu mohl dojde mezi těmito aktualizacemi a vašimi _searchData
a _children
dokumenty by neměly stejné odpovídající záznamy v addressesR
pole.
Totéž platí pro replikaci, protože obě operace musí být přehrány pomocí sekundárních uzlů.
Co by byla hezká funkce, byla by možnost použít $elemMatch v aktualizaci část vašeho dotazu. Tímto způsobem byste se dotazovali na pozici prvku na této straně. Ale toto zatím neexistuje . Ale od verze 2.6 výše můžete udělejte něco takového:
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"
}
}
}
]
})
To je popsáno na stránce manuálu v části Hromadná aktualizace .