2017-02-22 6 views
5

के साथ मोंगोडीबी में थोक आवेषण/अपडेट करें। मैं पोंगोन्गो/पांडा के साथ mongoDb में अद्यतन/सम्मिलित कैसे करूं? मुझे जो त्रुटि मिलती है वह batch op errors occurred मुझे कारण है क्योंकि मैं "_id" सेट करता हूं, जिसे मैं करना चाहता हूं। मैं कोड पहले रन पर ठीक चलाता हूं, लेकिन दूसरे रन पर यह विफल रहता है। मैं वर्कफ़्लो में पांडा का उपयोग करना चाहता हूं। डेटा में डेटाटाइम ऑब्जेक्ट होता है।प्योंमोन्गो

के साथ upsert = True के लिए वाक्यविन्यास पूरी तरह से अलग है। update के साथ एक कुशल समाधान सहायक होगा, जहां "_id" या "qid" सेट किया जा सकता है। लेकिन, पाइथन डेटाटाइम ऑब्जेक्ट्स हैं!

InSQL = 'SELECT * from database2.table2 ' 
sqlOut = pd.read_sql(InSQL,cxn) 
sqlOut['_id'] = "20170101" + ":"+ sqlOut['Var'] 

dfOut = sqlOut.to_json(orient='records',date_format='iso') 
try: 
    db["test"].insert_many(json.loads(dfOut)) 
except Exception as e: print e 

मैं एक pt इनाम है, जो कोई जवाब नहीं के साथ, समाप्त हो गई है दे दिया है। हम्म ...

+0

मोंगो ने 'स्ट्रिंग बेस इनपुट' का उपयोग किया और किसी भी परिवर्तनीय डालने (केवल ऑपरेटर) की अनुमति नहीं दी [इसे जांचें] (http://stackoverflow.com/questions/2803852/python-date-string-to-date-object), 'json.loads (dfOut)' आप स्थानीय चर को प्रविष्टि के रूप में सम्मिलित नहीं कर सकते! प्राथमिक कुंजी 'YYYYmmDDHHMMSS' +' काउंटर वैल्यू ' – dsgdfg

+0

आप' बल्कवाइट एरर 'विवरण में खोद सकते हैं और क्या हो रहा है इसके बारे में एक बेहतर विचार प्राप्त कर सकते हैं। हो सकता है कि आपकी व्यक्तिगत रूप से परिभाषित आईडी डुप्लीकेट हों या 12-बाइट सीमा का उल्लंघन करें। विवरण के लिए http://stackoverflow.com/questions/30355790/mongodb-bulk-write-error देखें। –

+0

तथ्य यह है कि _id पहली बार काम करता है, मुझे बताता है कि 12-बाइट सीमा चिंता नहीं है। हां, _id या gid डुप्लिकेट हैं और अपडेट के लिए आवश्यक हैं। – Merlin

उत्तर

0

बैच सेशन त्रुटि हो सकता है डुप्लिकेट _ id की वजह से, तो एक ही _ id दस्तावेज पहले से ही मोंगो में

डालने से पहले हटा सकते हैं या https://api.mongodb.com/python/current/api/pymongo/collection.html?highlight=update#pymongo.collection.Collection.update_many

https://docs.mongodb.com/manual/reference/method/db.collection.updateMany/

0

update_many का उपयोग आप एक मिल त्रुटि क्योंकि आप उन फ़ील्ड वाले दस्तावेज़ों को सम्मिलित करने का प्रयास करते हैं जो मौजूदा दस्तावेज़ों के साथ दूसरे और बाद में insert_many कॉल पर संघर्ष करते हैं। आपने सही ढंग से अनुमान लगाया है कि यह आपकी सेटिंग _id स्पष्ट रूप से हो सकता है, जो तब संग्रह में मौजूदा _id मानों के साथ संघर्ष करेगा।

MongoDB automatically creates an unique index on _id, जो मूल्यों को डुप्लिकेट करने से मना करता है।

आपको को पहले दस्तावेजों के बाद कॉल पर अपने दस्तावेज़ों को अपडेट या प्रतिस्थापित करने की आवश्यकता है (जो दस्तावेज़ों को उनके पहले संस्करण में सम्मिलित करते हैं)। वास्तव में "अप्सर्ट" की एक अवधारणा है जो संग्रह में गैर-पूर्व-मौजूदा दस्तावेज़ों को सम्मिलित करने और मौजूदा लोगों को अपडेट करने का ख्याल रखेगी।

आपके विकल्प:

  • सबसे कुशल: pymongo.collection.Collection.bulk_write

    import pymongo 
    
    operations = [pymongo.operations.ReplaceOne(
        filter={"_id": doc["_id"]}, 
        replacement=doc, 
        upsert=True 
        ) for doc in json.loads(dfOut)] 
    
    result = db["test"].bulk_write(operations) 
    # handle results 
    

ध्यान दें कि यह क्षमता भी है क्षेत्र संग्रह, जो संयोग से यही स्थिति है में सूचीबद्ध किया गया है या पर निर्भर करता है _id। (भी pymongo.operations.ReplaceOne देख)

  • अपने संग्रह से अधिक

    लूप और pymongo.collection.Collection.update_one या pymongo.collection.Collection.replace_one (क्योंकि नहीं थोक अक्षम) बुला

    import pymongo 
    
    results = [] 
    for doc in json.load(dfOut): 
        result = db["test"].replace_one(
         filter={"_id": doc["_id"]}, 
         replacement=doc, 
         upsert=True 
         ) 
        results.append(result) 
    
    # handle results 
    

नोट: pymongo.collection.Collection.update_many अपनी आवश्यकताओं के लिए अनुपयुक्त लगता है जब से तुम नहीं कर रहे हैं किसी दिए गए फ़िल्टर के सभी मैचों पर समान मूल्य सेट करने का प्रयास कर रहा है।