すべてをアトミックに実行できることを除けば、変更を加えたい既存の条件は2種類あり、それぞれをアトミックに処理できます。
- キーのレコードが存在しません
- キーのレコードが存在し、その
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}}
を変更します。 to {'$not': {'$gte': new_time}}