In Anbetracht Ihres Kommentars scheinen Sie auf dem richtigen Weg zu sein. Wie Sie wissen, ist der Positions-$
Operator ist nur ein "Wert"-Container, der den Index hat des ersten in Ihrer Abfrage gefundenen Array-Elements.
Sie "könnten" Verwenden Sie das, wenn Sie absolut wären Stellen Sie sicher, dass Ihre beiden Arrays immer die gleiche Anzahl von Elementen enthalten und dass diese entsprechenden Einträge zu allen Zeiten an der gleichen Position waren.
Also ja, verwenden Sie sicherheitshalber $elemMatch mit zwei Update-Operationen wie so
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'
}
})
Die einzige wirkliche Überlegung hier ist, dass es aufgrund der zwei Updates möglich ist dass ein Lesen des Dokuments könnte zwischen diesen Aktualisierungen und Ihren _searchData
auftreten und _children
Dokumente hätten nicht die gleiche Entsprechung Einträge in addressesR
Arrays.
Dasselbe gilt für die Replikation, da beide Operationen wiederholt werden müssen durch die sekundären Knoten.
Was ein nettes Feature wäre, wäre $elemMatch im Update verwenden zu können Teil Ihrer Anfrage. Auf diese Weise würden Sie die Position des Elements auf dieser Seite abfragen. Aber das gibt es noch nicht . Aber ab 2.6 aufwärts können Sie das können mach so was:
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"
}
}
}
]
})
Dies wird in der Handbuchseite unter Bulk Update behandelt .