sql >> Databáze >  >> NoSQL >> MongoDB

Poziční $ pracuje na různých částech stejného dokumentu?

Vzhledem k vašemu komentáři se zdá, že jste na správné cestě. Jak víte, poziční $ operátor je pouze "hodnotový" kontejner, který má index prvního prvku pole nalezeného ve vašem dotazu.

"mohli" použijte to, pokud jste byli naprosto ujistěte se, že vaše dvě pole vždy obsahovaly stejný počet prvků a že tyto odpovídající položky byly vždy na stejné pozici.

Takže ano, abyste byli v bezpečí, použijte $elemMatch s dvěma aktualizovat operace jako 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'
  }
})

Jediná skutečná úvaha je zde kvůli dvěma aktualizacím možná že čtení dokumentu mohl dojde mezi těmito aktualizacemi a vašimi _searchData a _children dokumenty by neměly stejné odpovídající záznamy v addressesR pole.

Totéž platí pro replikaci, protože obě operace musí být přehrány pomocí sekundárních uzlů.

Co by byla hezká funkce, byla by možnost použít $elemMatch v aktualizaci část vašeho dotazu. Tímto způsobem byste se dotazovali na pozici prvku na této straně. Ale toto zatím neexistuje . Ale od verze 2.6 výše můžete udělejte něco takového:

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

    ]
})

To je popsáno na stránce manuálu v části Hromadná aktualizace .




  1. Konverze datového rámce na RDD[(String, String)]

  2. Mongoose vrátí hodnotu nedefinovaná pro existující pole

  3. Jak provést vnitřní spojení v MongoDB?

  4. Škálování Socket.IO na více procesů Node.js pomocí clusteru