Potrebbero esserci altri modi per ottenere ciò, ma un approccio consiste nel creare una versione dei documenti ed emettere aggiornamenti solo rispetto alla versione che l'utente aveva letto in precedenza (ad esempio, assicurarsi che nessun altro abbia aggiornato il documento dall'ultima lettura). Ecco un breve esempio di questa tecnica che utilizza 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 in quanto sopra, la chiave "n" è 1, indicando che il documento è stato aggiornato
>>> 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}
qui dove abbiamo provato ad aggiornare rispetto alla versione sbagliata, la chiave "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}
Nota che questa tecnica si basa sull'utilizzo di scritture sicure, altrimenti non riceviamo un riconoscimento che indica il numero di documenti aggiornati. Una variazione su questo userebbe il findAndModify
comando, che restituirà il documento o None
(in Python) se non è stato trovato alcun documento corrispondente alla query. findAndModify
ti consente di restituire la nuova (ovvero dopo l'applicazione degli aggiornamenti) o la vecchia versione del documento.