Mungkin ada cara lain untuk mencapai hal ini, tetapi satu pendekatan adalah dengan membuat versi dokumen Anda, dan mengeluarkan pembaruan hanya terhadap versi yang telah dibaca pengguna sebelumnya (yaitu, memastikan bahwa tidak ada orang lain yang telah memperbarui dokumen sejak terakhir dibaca). Berikut adalah contoh singkat dari teknik ini menggunakan 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}
perhatikan di atas, kunci "n" adalah 1, menunjukkan bahwa dokumen telah diperbarui
>>> 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}
di sini di mana kami mencoba memperbarui versi yang salah, kunci "n" adalah 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}
Perhatikan bahwa teknik ini bergantung pada penggunaan penulisan yang aman, jika tidak, kami tidak mendapatkan pengakuan yang menunjukkan jumlah dokumen yang diperbarui. Variasi pada ini akan menggunakan findAndModify
perintah, yang akan mengembalikan dokumen, atau None
(dengan Python) jika tidak ada dokumen yang cocok dengan kueri yang ditemukan. findAndModify
memungkinkan Anda mengembalikan dokumen versi baru (yaitu setelah pembaruan diterapkan) atau versi lama.