A parte essere in grado di fare tutto in modo atomico, ci sono due tipi di condizioni esistenti in cui vuoi apportare un cambiamento e puoi gestirle in modo atomico:
- non esiste alcun record per la chiave
- esiste un record per la chiave e il relativo
update_time
è più vecchio dinew_time
Aggiorna un record esistente per la chiave:
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
}
}
)
Inserisci se prima non esisteva un record per la chiave:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
è stato aggiunto in MongoDB 2.4)
Potresti riuscire a metterli insieme per ottenere ciò di cui hai bisogno, ad esempio:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
Tuttavia, a seconda di quali scale temporali di rimozione/inserimento potrebbero essere possibili nel tuo sistema, potresti aver bisogno di più chiamate (aggiornamento/inserimento/aggiornamento) o altri trucchi.
A parte:se vuoi che un record manchi il update_time
campo da considerare come un record non aggiornato da aggiornare, cambia {'$lt': new_time}}
a {'$not': {'$gte': new_time}}