sql >> Database >  >> NoSQL >> MongoDB

Positioneel $ werkt aan verschillende delen van hetzelfde document?

Gezien je reactie ben je op de goede weg. Zoals u weet, is de positionele $ operator is gewoon een "waarde" container, die de index . heeft van het eerste array-element dat overeenkomt met uw zoekopdracht.

Je 'zou' gebruik dat als je absoluut . was zorg ervoor dat uw twee arrays altijd hetzelfde aantal elementen bevatte en dat deze corresponderende items altijd op dezelfde positie stonden.

Dus ja, om veilig te zijn, gebruik $elemMatch met twee update operaties zoals zo

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'
  }
})

De enige echte overweging hier is dat het vanwege de twee updates mogelijk is dat een lees van het document zou optreden tussen die updates en uw _searchData en _children documenten zouden niet dezelfde overeenkomstige . hebben vermeldingen in de addressesR arrays.

Hetzelfde geldt voor replicatie, aangezien beide bewerkingen moeten worden opnieuw afgespeeld door de secundaire knooppunten.

Wat een leuke functie zou zijn, zou zijn om $elemMatch te kunnen gebruiken in de update onderdeel van uw vraag. Op die manier zou je vragen naar de positie van het element aan die kant. Maar dit bestaat nog niet . Maar vanaf 2.6 kun je mag doe zoiets als dit:

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"
                }
            }
        }

    ]
})

Dat wordt behandeld in de handleiding onder Bulk Update .




  1. In MongoDB, hoe een query uit te voeren op basis van of een tekenreeksveld een ander bevat?

  2. Mongo-verbindingslek met morphia

  3. Mongo db-aggregatie meerdere voorwaarden

  4. Verkeerde afstandsberekening met MongoDB