संपूर्ण कार्य को परमाणु रूप से करने में सक्षम होने के अलावा, दो प्रकार की मौजूदा स्थितियां हैं जहां आप परिवर्तन करना चाहते हैं, और आप उनमें से प्रत्येक से परमाणु रूप से निपट सकते हैं:
- कुंजी के लिए कोई रिकॉर्ड मौजूद नहीं है
- कुंजी के लिए एक रिकॉर्ड मौजूद है और उसका
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}}
बदलें करने के लिए {'$not': {'$gte': new_time}}