Behalve dat je het hele ding atomair kunt doen, zijn er twee soorten bestaande omstandigheden waarin je een verandering wilt aanbrengen, en je kunt elk van hen atomair aanpakken:
- er bestaat geen record voor de sleutel
- er bestaat een record voor de sleutel en de
update_time
is ouder dannew_time
Een bestaande record voor sleutel bijwerken:
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
}
}
)
Invoegen als een record voor sleutel nog niet bestond:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
is toegevoegd in MongoDB 2.4)
Je kunt die misschien samenvoegen om te krijgen wat je nodig hebt, bijvoorbeeld:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
Afhankelijk van welke tijdschalen voor verwijderen/invoegen mogelijk zijn in uw systeem, heeft u mogelijk meerdere oproepen (bijwerken/invoegen/bijwerken) of andere shenanigans nodig.
Terzijde:als je wilt dat een record de update_time
. mist veld dat moet worden behandeld als een verouderd record om bij te werken, verander {'$lt': new_time}}
naar {'$not': {'$gte': new_time}}