इसे डालने के बाद मैं एक मैंगो दस्तावेज़ को कैसे अपडेट करूं?


83

मान लीजिए कि मैं दस्तावेज़ सम्मिलित करता हूं।

post = { some dictionary }
mongo_id = mycollection.insert(post)

अब, मान लें कि मैं एक फ़ील्ड जोड़ना और इसे अपडेट करना चाहता हूं। मैं उसको कैसे करू? यह काम नहीं लगता है .....

post = mycollection.find_one({"_id":mongo_id}) 
post['newfield'] = "abc"
mycollection.save(post)

जवाबों:


108

Pymongo में आप के साथ अद्यतन कर सकते हैं:
mycollection.update({'_id':mongo_id}, {"$set": post}, upsert=False)
डेटाबेस में पोस्ट नहीं पाया जाता है, तो अद्यतन करने के बजाय ऊपर पैरामीटर पैरामीटर सम्मिलित करेगा।
डॉक्यूमेंटेशन मोंगोडब साइट पर उपलब्ध है ।

अद्यतन संस्करण> 3 उपयोग के लिए update_one के बजाय अद्यतन :

mycollection.update_one({'_id':mongo_id}, {"$set": post}, upsert=False)


1
@ इलियट - अन्य विकल्प क्या है?
अजयरामेश

29
mycollection.find_one_and_update({"_id": mongo_id}, 
                                 {"$set": {"newfield": "abc"}})

आपके लिए शानदार काम करना चाहिए। यदि आईडी का कोई दस्तावेज नहीं है mongo_id, तो यह विफल हो जाएगा, जब तक कि आप भी उपयोग न करें upsert=True। यह पुराना दस्तावेज़ डिफ़ॉल्ट रूप से देता है। नया पाने के लिए, पास करें return_document=ReturnDocument.AFTER। सभी मापदंडों को एपीआई में वर्णित किया गया है

यह विधि MongoDB 3.0 के लिए शुरू की गई थी। इसे 3.2, 3.4 और 3.6 के लिए बढ़ाया गया था।


2
यह भी काम करता है अगर आप "उपयोगकर्ता नाम" जैसे किसी अन्य फ़ील्ड के लिए "_id" उप करते हैं
क्रिस

1
@ क्रिस जब आप "वर्तमान pymongo" कहते हैं, तो भविष्य से हममें से एक ही संस्करण नहीं हो सकता है। विशिष्ट होना अच्छा है।
Mnebuerquo

@Mnebuerquo यह एक उत्कृष्ट बिंदु है जिसे मैंने अन्यथा नहीं देखा होगा। भविष्य के पदों में करेंगे, thx।
क्रिस

@ क्रिस संपादित करें बहुत मदद करता है। धन्यवाद! और भविष्य से मुझे धन्यवाद जब मैं यह भूल जाता हूं और इसे फिर से देखना पड़ता है!
Mnebuerquo

22

मैं collection.save(the_changed_dict)इस तरह से उपयोग करूंगा । मैंने अभी इसका परीक्षण किया है, और यह अभी भी मेरे लिए काम करता है। निम्नलिखित सीधे से उद्धृत किया गया है pymongo doc.:

save(to_save[, manipulate=True[, safe=False[, **kwargs]]])

इस संग्रह में एक दस्तावेज़ सहेजें।

यदि to_save में पहले से ही "_id" है तो एक अद्यतन () (upsert) ऑपरेशन किया जाता है और उस "_id" के साथ कोई भी मौजूदा दस्तावेज़ ओवरराइट कर दिया जाता है। अन्यथा एक सम्मिलित () ऑपरेशन किया जाता है। इस मामले में अगर हेरफेर सही है तो "_id" को to_save में जोड़ा जाएगा और यह विधि सहेजे गए दस्तावेज़ का "_id" लौटाती है। यदि हेरफेर गलत है तो सर्वर द्वारा "_id" जोड़ दिया जाएगा लेकिन यह विधि वापस नहीं आएगी।


9

यह एक पुराना सवाल है, लेकिन मैं इसका जवाब देते समय इस बात पर अड़ गया कि मैं संदर्भ के लिए उत्तर को अद्यतन देना चाहता था।

तरीके saveऔर updateपदावनत हैं।

save (to_save, manipulate = True, check_keys = True, ** kwargs) document इस संग्रह में एक दस्तावेज़ सहेजें।

DEPRECated - इसके बजाय Insert_one () या प्रतिस्थापित_one () का उपयोग करें।

संस्करण 3.0 में बदला गया: सुरक्षित पैरामीटर हटा दिया गया। अनजाने लेखन कार्यों के लिए w = 0 पास करें।

अद्यतन (युक्ति, दस्तावेज, upser = गलत, जोड़ तोड़ = गलत, बहु = गलत, check_keys = सत्य, ** kwargs) इस संग्रह में एक दस्तावेज़ (ओं) को अपडेट करें।

DEPRECATED - इसके स्थान पर replace_one (), update_one (), या update_many () का उपयोग करें।

संस्करण 3.0 में बदला गया: सुरक्षित पैरामीटर हटा दिया गया। अनजाने लेखन कार्यों के लिए w = 0 पास करें।

ओपी विशेष मामले में, इसका उपयोग करना बेहतर है replace_one


9

PyMongo शीर्षक के बारे में नवीनतम दस्तावेज़ के अनुसार, एक दस्तावेज़ सम्मिलित करें (सम्मिलित करें हटा दिया गया है) और रक्षात्मक दृष्टिकोण के अनुसार, आपको निम्नानुसार सम्मिलित और अद्यतन करना चाहिए:

result = mycollection.insert_one(post)
post = mycollection.find_one({'_id': result.inserted_id})

if post is not None:
    post['newfield'] = "abc"
    mycollection.save(post)
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.