可能有其他方法可以完成此操作,但一种方法是对文档进行版本化,并仅针对用户先前阅读的版本发布更新(即,确保自上次阅读以来没有其他人更新过该文档)。下面是一个使用 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}
注意上面,key“n”为1,表示文档被更新
>>> 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}
在这里,我们尝试针对错误的版本进行更新,键“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}
请注意,此技术依赖于使用安全写入,否则我们不会收到指示更新文档数量的确认。对此的一种变体将使用该findAndModify
命令,该命令将返回文档,或者None
(在 Python 中)如果没有找到与查询匹配的文档。findAndModify
允许您返回文档的新版本(即应用更新后)或旧版本。