Além de ser capaz de fazer tudo atomicamente, existem dois tipos de condições existentes em que você deseja fazer uma mudança, e você pode lidar com cada uma delas atomicamente:
- não existe nenhum registro para a chave
- existe um registro para a chave e seu
update_time
é mais antigo quenew_time
Atualize um registro existente para a chave:
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
}
}
)
Insira se um registro para a chave não existia 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
foi adicionado no MongoDB 2.4) Você pode juntá-los para obter o que precisa, por exemplo:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
No entanto, dependendo de quais escalas de tempo de remoção/inserção podem ser possíveis em seu sistema, você pode precisar de várias chamadas (atualização/inserção/atualização) ou outras travessuras.
À parte:Se você deseja um registro sem o
update_time
campo a ser tratado como um registro obsoleto para atualizar, altere {'$lt': new_time}}
para {'$not': {'$gte': new_time}}