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

Operacje na dokumentach MongoDB są atomowe i izolowane, ale czy są spójne?

Mogą istnieć inne sposoby osiągnięcia tego celu, ale jednym z podejść jest tworzenie wersji dokumentów i publikowanie aktualizacji tylko w stosunku do wersji, którą użytkownik wcześniej przeczytał (tj. Upewnij się, że nikt inny nie zaktualizował dokumentu od czasu ostatniego czytania). Oto krótki przykład tej techniki przy użyciu 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}

uwaga powyżej, klucz "n" to 1, co oznacza, że ​​dokument został zaktualizowany

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

tutaj, gdzie próbowaliśmy zaktualizować z niewłaściwą wersją, klucz "n" to 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}

Zauważ, że ta technika opiera się na bezpiecznym zapisie, w przeciwnym razie nie otrzymamy potwierdzenia wskazującego liczbę zaktualizowanych dokumentów. Odmianą tego byłoby użycie findAndModify polecenie, które albo zwróci dokument, albo None (w Pythonie), jeśli nie znaleziono dokumentu pasującego do zapytania. findAndModify umożliwia zwrócenie nowej (tj. po zastosowaniu aktualizacji) lub starej wersji dokumentu.



  1. Redis
  2.   
  3. MongoDB
  4.   
  5. Memcached
  6.   
  7. HBase
  8.   
  9. CouchDB
  1. Używanie $exists w wyrażeniu MongoDB

  2. Jak filtrować tablicę poddokumentów?

  3. Nie udało się połączyć Mongoose z Atlasem

  4. Ostrzeżenie o wycofaniu:collection.findAndModify jest przestarzałe. Zamiast tego użyć findOneAndUpdate, findOneAndReplace lub findOneAndDelete?

  5. Mongoose nie aktualizuje mojego dokumentu, jeśli nie mam funkcji zwrotnej