MongoDB
 sql >> Datenbank >  >> NoSQL >> MongoDB

Positional $ Arbeiten an verschiedenen Teilen desselben Dokuments?

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 .