Poza tym, że nie jesteś w stanie zrobić wszystkiego atomowo, istnieją dwa rodzaje istniejących warunków, w których chcesz dokonać zmiany, i możesz poradzić sobie z każdym z nich atomowo:
- brak wpisu dla klucza
- istnieje rekord klucza i jego
update_time
jest starszy niżnew_time
Zaktualizuj istniejący rekord dla klucza:
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
}
}
)
Wstaw, jeśli rekord dla klucza nie istniał wcześniej:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
został dodany w MongoDB 2.4)
Możesz je połączyć, aby uzyskać to, czego potrzebujesz, np.:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
Jednak w zależności od tego, jakie skale czasu usuwania/wstawiania mogą być możliwe w twoim systemie, możesz potrzebować wielu wywołań (aktualizacja/wstawianie/aktualizacja) lub innych sztuczek.
Na bok:jeśli chcesz, aby rekord nie zawierał update_time
pole, które ma być traktowane jako przestarzały rekord do aktualizacji, zmień {'$lt': new_time}}
do {'$not': {'$gte': new_time}}