Освен възможността да направите всичко атомарно, има два вида съществуващи условия, при които искате да направите промяна, и можете да се справите с всяко от тях атомарно:
- не съществува запис за ключа
- съществува запис за ключа и неговия
update_time
е по-стар отnew_time
Актуализирайте съществуващ запис за ключ:
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
}
}
)
Вмъкнете, ако запис за ключ не е съществувал преди:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
беше добавен в MongoDB 2.4)
Може да успеете да ги съберете, за да получите това, от което се нуждаете, напр.:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
Въпреки това, в зависимост от това какви времеви мащаби за премахване/вмъкване може да са възможни във вашата система, може да се нуждаете от множество извиквания (актуализация/вмъкване/актуализация) или други хитрости.
Настрана:Ако искате запис, в който липсва update_time
поле, което да се третира като остарял запис за актуализиране, променете {'$lt': new_time}}
до {'$not': {'$gte': new_time}}