Kromě toho, že můžete udělat celou věc atomicky, existují dva druhy stávajících podmínek, kdy chcete provést změnu, a s každou z nich se můžete vypořádat atomicky:
- pro klíč neexistuje žádný záznam
- existuje záznam pro klíč a jeho
update_time
je starší nežnew_time
Aktualizujte existující záznam pro klíč:
def update_if_stale(key, new_value, new_time):
collection.update({'key': key,
'update_time': {'$lt': new_time}
},
{'$set': {'value': new_value,
'update_time': new_time
}
}
)
Vložit, pokud záznam pro klíč dříve neexistoval:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
byl přidán do MongoDB 2.4)
Možná je budete moci dát dohromady, abyste získali to, co potřebujete, např.:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
V závislosti na tom, jaká časová měřítka pro odebrání/vložení by mohla být ve vašem systému možná, budete možná potřebovat více hovorů (aktualizace/vložení/aktualizace) nebo jiné podvody.
Stranou:Pokud chcete, aby v záznamu chyběl parametr update_time
pole, které má být považováno za zastaralý záznam pro aktualizaci, změňte {'$lt': new_time}}
do {'$not': {'$gte': new_time}}