Förutom att kunna göra det hela atomärt, det finns två typer av existerande förhållanden där du vill göra en förändring, och du kan hantera var och en av dem atomärt:
- ingen post för nyckeln finns
- en post för nyckeln finns och dess
update_time
är äldre ännew_time
Uppdatera en befintlig post för nyckel:
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
}
}
)
Infoga om en post för nyckel inte fanns tidigare:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
lades till i MongoDB 2.4)
Du kanske kan sätta ihop dem för att få det du behöver, t.ex.:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
Beroende på vilka tidsskalor för borttagning/infogning som kan vara möjliga i ditt system, kan du dock behöva flera samtal (uppdatering/infoga/uppdatera) eller andra grejer.
Bortsett från:Om du vill ha en post som saknar update_time
fält som ska behandlas som en inaktuell post att uppdatera, ändra {'$lt': new_time}}
till {'$not': {'$gte': new_time}}