Като се има предвид, че коментирате, изглежда сте на прав път. Както знаете, позиционният $код>
е просто контейнер за "стойност", който има индекс на първия елемент от масива, съответстващ във вашата заявка.
Вие „можете“ използвайте това, ако сте абсолютно уверете се, че вашите два масива винаги съдържаше същия брой елементи и че тези съответстващи записи бяха на една и съща позиция през цялото време.
Така че да, за да сте в безопасност, използвайте $elemMatch с два подобни операции за актуализиране
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'
}
})
Единственото истинско съображение тук е, че поради двете актуализации е възможно че аната от документа може възникват между тези актуализации и вашите _searchData
и _children
документи няма да имат същото съответствие записи в addressesR
масиви.
Същото важи и за репликацията, тъй като и двете операции трябва да бъдат повтаряни от вторичните възли.
Това, което би било хубава функция, е да можете да използвате $elemMatch в актуализацията част от вашето запитване. По този начин ще търсите позицията на елемента от тази страна. Но това не съществуваоще . Но от 2.6 нагоре можите направете нещо подобно:
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"
}
}
}
]
})
Това е описано в страницата с ръководство под Групова актуализация .