sql >> Databasteknik >  >> NoSQL >> MongoDB

Positional $ arbetar med olika delar av samma dokument?

Med tanke på din kommentar verkar du vara på rätt väg. Som du är medveten om är positionella $ operatorn är bara en "värde"-behållare, som har index av det första matriselementet som matchades i din fråga.

Du "kunde" använd det om du var absolut se till att dina två arrayer alltid innehöll samma antal element och att dessa motsvarande poster var i samma position hela tiden.

Så ja, för att vara säker, använd $elemMatch med två uppdatera operationer som så

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

Det enda verkliga övervägandet här är på grund av de två uppdateringarna som det är möjligt att en läs av dokumentet kunde inträffar mellan dessa uppdateringar och din _searchData och _children dokument skulle inte ha samma motsvarande poster i addressesR arrayer.

Samma sak gäller med replikering, eftersom båda operationerna måste spelas om av de sekundära noderna.

Vad som skulle vara en trevlig funktion skulle vara att kunna använda $elemMatch i uppdateringen en del av din fråga. På det sättet skulle du fråga efter elementets position på den sidan. Men det här finns inte ännu . Men från 2,6 och uppåt kan gör något så här:

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

    ]
})

Detta beskrivs i manualsidan under Massuppdatering .




  1. batchSize-fältnamn ignoreras i Field Projection

  2. Anslutningen återställd av Peer pymongo

  3. Mongoexport med $gt- och $lt-begränsningar på ett datumintervall

  4. Kontrollera det aktuella antalet anslutningar till MongoDb