MongoDB
 sql >> Baza danych >  >> NoSQL >> MongoDB

Pozycyjna $ pracująca na różnych częściach tego samego dokumentu?

Biorąc pod uwagę Twój komentarz, wydajesz się być na dobrej drodze. Jak wiesz, pozycyjny $ operator jest po prostu kontenerem „wartości”, który ma indeks pierwszego elementu tablicy dopasowanego w zapytaniu.

„mógłbyś” użyj tego, jeśli byłeś absolutnie upewnij się, że Twoje dwie tablice zawsze zawierał taką samą liczbę elementów i że te odpowiadające sobie wpisy były w tej samej pozycji przez cały czas.

Więc tak, aby być bezpiecznym, użyj $elemMatch z dwoma operacje aktualizacji, takie jak tak

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

Jedyną rzeczywistą uwagą jest to, że dwie aktualizacje są możliwe że czyta dokumentu może występują pomiędzy tymi aktualizacjami a Twoimi _searchData i _children dokumenty nie miałyby tego samego odpowiadającego wpisy w addressesR tablice.

To samo dotyczy replikacji, ponieważ obie operacje muszą zostać odtworzone przez węzły pomocnicze.

Przyjemną funkcją byłaby możliwość użycia $elemMatch w aktualizacji część zapytania. W ten sposób będziesz pytał o pozycję elementu po tej stronie. Ale to nie istnieje jeszcze . Ale od 2.6 w górę możesz zrób coś takiego:

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

    ]
})

Zostało to omówione na stronie podręcznika w sekcji Aktualizacja zbiorcza .




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Jak skalować MongoDB?

  2. Jak wykonać operacje Update w GridFS (przy użyciu Javy)?

  3. MongoDB osadzone w java

  4. Jak skutecznie zarządzać dużymi bazami danych

  5. jak uzyskać zwracaną wartość func findAndModify w MongoDB za pomocą mongoose?