Biorąc pod uwagę Twój komentarz, wydajesz się być na dobrej drodze. Jak wiesz, pozycyjny $
operator jest po prostu kontenerem „wartości”, który ma indeks pierwszego elementu tablicy dopasowanego w zapytaniu.
„mógłbyś” użyj tego, jeśli byłeś absolutnie upewnij się, że Twoje dwie tablice zawsze zawierał taką samą liczbę elementów i że te odpowiadające sobie wpisy były w tej samej pozycji przez cały czas.
Więc tak, aby być bezpiecznym, użyj $elemMatch z dwoma operacje aktualizacji, takie jak 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'
}
})
Jedyną rzeczywistą uwagą jest to, że dwie aktualizacje są możliwe że czyta dokumentu może występują pomiędzy tymi aktualizacjami a Twoimi _searchData
i _children
dokumenty nie miałyby tego samego odpowiadającego wpisy w addressesR
tablice.
To samo dotyczy replikacji, ponieważ obie operacje muszą zostać odtworzone przez węzły pomocnicze.
Przyjemną funkcją byłaby możliwość użycia $elemMatch w aktualizacji część zapytania. W ten sposób będziesz pytał o pozycję elementu po tej stronie. Ale to nie istnieje jeszcze . Ale od 2.6 w górę możesz zrób coś takiego:
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"
}
}
}
]
})
Zostało to omówione na stronie podręcznika w sekcji Aktualizacja zbiorcza .