sql >> Base de Datos >  >> NoSQL >> MongoDB

Las operaciones de documentos de MongoDB son atómicas y aisladas, pero ¿son consistentes?

Puede haber otras formas de lograr esto, pero un enfoque es crear una versión de sus documentos y emitir actualizaciones solo contra la versión que el usuario había leído previamente (es decir, asegurarse de que nadie más haya actualizado el documento desde la última vez que se leyó). Aquí hay un breve ejemplo de esta técnica usando 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}

nota en lo anterior, la clave "n" es 1, lo que indica que el documento se actualizó

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

aquí donde intentamos actualizar contra la versión incorrecta, la clave "n" es 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}

Tenga en cuenta que esta técnica se basa en el uso de escrituras seguras; de lo contrario, no obtenemos un reconocimiento que indique la cantidad de documentos actualizados. Una variación de esto usaría findAndModify comando, que devolverá el documento o None (en Python) si no se encuentra ningún documento que coincida con la consulta. findAndModify le permite devolver la versión nueva (es decir, después de aplicar las actualizaciones) o la versión anterior del documento.