Abgesehen davon, dass Sie das Ganze atomar erledigen können, gibt es zwei Arten von bestehenden Bedingungen, bei denen Sie eine Änderung vornehmen möchten, und Sie können mit jeder von ihnen atomar umgehen:
- Kein Datensatz für den Schlüssel vorhanden
- es existiert ein Datensatz für den Schlüssel und seine
update_time
ist älter alsnew_time
Aktualisieren Sie einen vorhandenen Datensatz für den Schlüssel:
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
}
}
)
Einfügen, wenn vorher kein Datensatz für Schlüssel vorhanden war:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
wurde in MongoDB 2.4 hinzugefügt)
Sie können diese möglicherweise zusammenstellen, um das zu erhalten, was Sie benötigen, z. B.:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
Je nachdem, welche Entfernungs-/Einfügezeitskalen in Ihrem System möglich sind, benötigen Sie jedoch möglicherweise mehrere Aufrufe (Aktualisieren/Einfügen/Aktualisieren) oder andere Spielereien.
Übrigens:Wenn Sie möchten, dass ein Datensatz die update_time
fehlt Feld, das als zu aktualisierender veralteter Datensatz behandelt werden soll, ändern Sie {'$lt': new_time}}
zu {'$not': {'$gte': new_time}}