Không thể thực hiện toàn bộ mọi thứ một cách nguyên tử, có hai loại điều kiện hiện tại mà bạn muốn thực hiện thay đổi và bạn có thể giải quyết từng điều kiện đó một cách nguyên tử:
- không có bản ghi nào cho khóa tồn tại
- một bản ghi cho khóa tồn tại và
update_time
của nó cũ hơnnew_time
Cập nhật bản ghi hiện có cho khóa:
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
}
}
)
Chèn nếu bản ghi cho khóa không tồn tại trước đây:
def insert_if_missing(key, new_value, new_time):
collection.update({'key': key},
{'$setOnInsert': {'value': new_value,
'update_time': new_time
}
},
upsert=True
)
($setOnInsert
đã được thêm vào MongoDB 2.4)
Bạn có thể kết hợp những thứ đó lại với nhau để có được thứ bạn cần, ví dụ:
def update_key(key, new_value, new_time):
insert_if_missing(key, new_value, new_time)
update_if_stale(key, new_value, new_time)
Tuy nhiên, tùy thuộc vào thang thời gian loại bỏ / chèn nào có thể có trong hệ thống của bạn, bạn có thể cần nhiều lệnh gọi (cập nhật / chèn / cập nhật) hoặc các trò tai quái khác.
Ngoài ra:Nếu bạn muốn bản ghi thiếu update_time
trường được coi là bản ghi cũ để cập nhật, hãy thay đổi {'$lt': new_time}}
tới {'$not': {'$gte': new_time}}