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

Operace dokumentů MongoDB jsou atomické a izolované, ale jsou konzistentní?

Mohou existovat jiné způsoby, jak toho dosáhnout, ale jedním přístupem je verze dokumentů a vydávání aktualizací pouze proti verzi, kterou si uživatel předtím přečetl (tj. zajistit, aby nikdo jiný dokument neaktualizoval od jeho posledního přečtení). Zde je krátký příklad této techniky pomocí pymongo:

>>> db.foo.save({'_id': 'a', 'version': 1, 'things': []}, safe=True)
'a'
>>> db.foo.update({'_id': 'a', 'version': 1}, {'$push': {'things': 'thing1'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': True, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 1}

poznamenejte si výše, klíč "n" je 1, což znamená, že dokument byl aktualizován

>>> db.foo.update({'_id': 'a', 'version': 1}, {'$push': {'things': 'thing2'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': False, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 0}

zde, kde jsme se pokusili provést aktualizaci proti nesprávné verzi, je klíč "n" 0

>>> db.foo.update({'_id': 'a', 'version': 2}, {'$push': {'things': 'thing2'}, '$inc': {'version': 1}}, safe=True)
{'updatedExisting': True, 'connectionId': 112, 'ok': 1.0, 'err': None, 'n': 1}
>>> db.foo.find_one()
{'things': ['thing1', 'thing2'], '_id': 'a', 'version': 3}

Všimněte si, že tato technika spoléhá na použití bezpečného zápisu, jinak nedostaneme potvrzení o počtu aktualizovaných dokumentů. Varianta tohoto by používala findAndModify příkaz, který buď vrátí dokument, nebo None (v Pythonu), pokud nebyl nalezen žádný dokument odpovídající dotazu. findAndModify umožňuje vrátit buď novou (tj. po použití aktualizací) nebo starou verzi dokumentu.



  1. Má WiredTiger z MongoDb problém s výkonem přerozdělení jako MMAPv1

  2. Existuje dobrá implementace fronty MongoDB s otevřeným zdrojovým kódem pro ovladač C#

  3. Čtení ze sekundární sady replik v mongodb prostřednictvím javascriptu

  4. Dotaz $pull vnořeného pole pomocí ovladače C# MongoDB