sql >> Databasteknik >  >> NoSQL >> MongoDB

MongoDB-dokumentverksamheten är atomär och isolerad, men är de konsekventa?

Det kan finnas andra sätt att åstadkomma detta, men ett tillvägagångssätt är att versionera dina dokument och utfärda uppdateringar mot endast den version som användaren tidigare läst (dvs. se till att ingen annan har uppdaterat dokumentet sedan det senast lästes). Här är ett kort exempel på denna teknik som använder 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}

notera i ovanstående, nyckel "n" är 1, vilket indikerar att dokumentet har uppdaterats

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

här där vi försökte uppdatera mot fel version är nyckeln "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}

Observera att denna teknik är beroende av att använda säkra skrivningar, annars får vi ingen bekräftelse som anger antalet uppdaterade dokument. En variant av detta skulle använda findAndModify kommando, som antingen returnerar dokumentet eller None (i Python) om inget dokument som matchar frågan hittades. findAndModify låter dig returnera antingen den nya (dvs. efter att uppdateringar har tillämpats) eller gamla versionen av dokumentet.



  1. E:Kan inte hitta paketet mongodb-org

  2. Frågar arrayelement med Mongo

  3. Hur utesluter man dokument från sökresultat med fält som inte finns i frågan?

  4. MongoDB Java-drivrutin:autoConnectRetry