2017-10-04 20 views
9

में बल्ककिर्ट के साथ त्रुटियों को संभालना मैं मोंगोडीबी और एक्सप्रेस के साथ नोडजेएस का उपयोग कर रहा हूं। मुझे रिकॉर्ड्स को रिकॉर्ड्स में सम्मिलित करने की आवश्यकता है जहां ईमेल फ़ील्ड अनिवार्य है। मैं रिकॉर्ड्स डालने के लिए insertMany फ़ंक्शन का उपयोग कर रहा हूं। जब अद्वितीय ईमेल डाले जाते हैं तो यह ठीक काम करता है, लेकिन जब डुप्लिकेट ईमेल दर्ज किए जाते हैं, तो ऑपरेशन अचानक टूट जाता है।मोंगो नोडजेएस

मैंने त्रुटि संदेश मुद्रित करने के लिए प्रयास करने का प्रयास करने का प्रयास किया, लेकिन जैसे ही एक डुप्लिकेट ईमेल डाला गया निष्पादन विफल हो जाता है। मैं निष्पादन जारी रखना चाहता हूं और डुप्लिकेट स्टोर करना चाहता हूं। मैं रिकॉर्ड्स/असफल रिकॉर्ड की अंतिम सूची प्राप्त करना चाहता हूं।

त्रुटि संदेश:

Unhandled rejection MongoError: E11000 duplicate key error collection: testingdb.gamers index: email_1 dup key:  

वहाँ किसी भी तरह से त्रुटियों को संभालने के लिए है या किसी अन्य दृष्टिकोण insertMany से अलग है?

अद्यतन:

ईमेल मेरे संग्रह में एक अद्वितीय क्षेत्र है।

+1

प्रश्न में आपने बताया कि _ मैं निष्पादन जारी रखना चाहता हूं और डुप्लिकेट_ स्टोर करना चाहता हूं। तो क्या आप डुप्लिकेट स्टोर करना चाहते हैं या नहीं? – alexmac

+0

मैंने अपनी समस्या को हल करने के लिए [Async] (https://www.npmjs.com/package/async) मॉड्यूल का उपयोग किया। – Anirudh

उत्तर

0

मैं टिप्पणी करना नहीं कर सकते, तो जवाब के रूप में चला जाता है: इस क्षेत्र के लिए अद्वितीय सूचकांक का उपयोग कर आप डेटाबेस संग्रह है, या अपने स्कीमा क्षेत्र के लिए अद्वितीय विशेषता है? कृपया कोड के बारे में अधिक जानकारी साझा करें।

MongoDB डॉक्स से:

"किसी भी महत्वपूर्ण यह है कि एक अद्वितीय सूचकांक का हिस्सा है, इस तरह के _ id के रूप में के लिए एक नकली मान डाला, एक अपवाद फेंकता एक _ id मूल्य पहले से मौजूद है के साथ एक दस्तावेज़ डालने के लिए निम्नलिखित का प्रयास। : "

try { 
    db.products.insertMany([ 
     { _id: 13, item: "envelopes", qty: 60 }, 
     { _id: 13, item: "stamps", qty: 110 }, 
     { _id: 14, item: "packing tape", qty: 38 } 
    ]); 
} catch (e) { 
    print (e); 
} 

_ id के बाद से: 13 पहले से मौजूद है, निम्न अपवाद फेंक दिया जाता है:

BulkWriteError({ 
    "writeErrors" : [ 
     { 
     "index" : 0, 
     "code" : 11000, 
     "errmsg" : "E11000 duplicate key error collection: restaurant.test index: _id_ dup key: { : 13.0 }", 
     "op" : { 
      "_id" : 13, 
      "item" : "envelopes", 
      "qty" : 60 
     } 
     } 
    ], 
(some code omitted) 

आशा है कि यह मदद करता है।

0

चूंकि आप जानते हैं कि डुप्लिकेट कुंजी सम्मिलन के कारण त्रुटि हो रही है, तो आप ऑब्जेक्ट की प्रारंभिक सरणी को दो हिस्सों में अलग कर सकते हैं। एक अद्वितीय कुंजी के साथ और दूसरा डुप्लिकेट के साथ। इस तरह आपके पास डुप्लिकेट की एक सूची है जिसे आप कुशल बना सकते हैं और मूलभूत सूची को सम्मिलित कर सकते हैं।

let a = [ 
 
    {'email': '[email protected]', 'dude': 4}, 
 
    {'email': '[email protected]', 'dude': 2}, 
 
    {'email': '[email protected]', 'dude': 2}, 
 
    {'email': '[email protected]', 'dude': 1} 
 
]; 
 

 
let i = a.reduce((i, j) => { 
 
    i.original.map(o => o.email).indexOf(j.email) == -1? i.original.push(j): i.duplicates.push(j); 
 
    return i; 
 
}, {'original': [], 'duplicates': []}); 
 

 
console.log(i);

संपादित करें: मैं बस महसूस किया कि इस अभ्यस्त काम अगर कुंजियां पहले से ही डीबी में मौजूद हैं। तो आपको शायद इस जवाब का उपयोग नहीं करना चाहिए। लेकिन बीमार बस इसे किसी और के संदर्भ के रूप में छोड़ दें जो एक ही पंक्ति के साथ सोच सकता है। Nic Cottrell's उत्तर सही है।

5

यदि आप {ordered:false} विकल्पों को insertMany() पर सेट करने पर विचार करते हुए, पहली त्रुटि को रोकने के बजाय सभी गैर-अद्वितीय दस्तावेज़ों को सम्मिलित करना जारी रखना चाहते हैं, उदा।

db.collection.insertMany ( [,, ...], { आदेश दिया: झूठी } )

the docs के अनुसार, अव्यवस्थित संचालन कतार में किसी भी शेष लिखने के संचालन की प्रक्रिया जारी है लेकिन अभी भी BulkWriteError में अपनी त्रुटियों को दिखायेगी।