MongoDB
 sql >> база данни >  >> NoSQL >> MongoDB

Позиционни $ работят върху различни части на един и същ документ?

Като се има предвид, че коментирате, изглежда сте на прав път. Както знаете, позиционният $ е просто контейнер за "стойност", който има индекс на първия елемент от масива, съответстващ във вашата заявка.

Вие „можете“ използвайте това, ако сте абсолютно уверете се, че вашите два масива винаги съдържаше същия брой елементи и че тези съответстващи записи бяха на една и съща позиция през цялото време.

Така че да, за да сте в безопасност, използвайте $elemMatch с два подобни операции за актуализиране

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

Единственото истинско съображение тук е, че поради двете актуализации е възможно че аната от документа може възникват между тези актуализации и вашите _searchData и _children документи няма да имат същото съответствие записи в addressesR масиви.

Същото важи и за репликацията, тъй като и двете операции трябва да бъдат повтаряни от вторичните възли.

Това, което би било хубава функция, е да можете да използвате $elemMatch в актуализацията част от вашето запитване. По този начин ще търсите позицията на елемента от тази страна. Но това не съществуваоще . Но от 2.6 нагоре можите направете нещо подобно:

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

    ]
})

Това е описано в страницата с ръководство под Групова актуализация .




  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. MongoDB конектор за PHP:брои документи за страниране

  2. Как да намерите всичко в mongoosejs?

  3. Сортиране на документи по стойност в последния елемент от масив, който съответства на филтъра. Mongodb

  4. MongoDB Mongoose прави заявки за дълбоко вложен масив от поддокументи по период от време

  5. Как да получите документите въз основа на филтри за дати (седмица, месец и персонализирани дати) в MongoDB?