Aparte de poder hacer todo de forma atómica, hay dos tipos de condiciones existentes en las que desea realizar un cambio, y puede tratar cada una de ellas de forma atómica:
- no existe ningún registro de la clave
- existe un registro para la clave y su
update_time
es anterior anew_time
Actualizar un registro existente para clave:
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
}
}
)
Inserte si no existía un registro para la clave antes:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
fue agregado en MongoDB 2.4)
Es posible que pueda juntarlos para obtener lo que necesita, por ejemplo:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
Sin embargo, dependiendo de qué escalas de tiempo de eliminación/inserción sean posibles en su sistema, es posible que necesite varias llamadas (actualizar/insertar/actualizar) u otras travesuras.
Aparte:si desea un registro al que le falte el update_time
campo para ser tratado como un registro obsoleto para actualizar, cambiar {'$lt': new_time}}
a {'$not': {'$gte': new_time}}