2015-12-08 9 views
5
let dbOperations = Edge.collection.initializeOrderedBulkOp() 
edges.forEach(edge => { 
    dbOperations.find({_id: edge.id}).upsert().updateOne({ 
     $set: { 
      value: edge.value 
     }, 
     $setOnInsert: { 
      _id: edge.id 
     } 
    }) 
}) 
dbOperations.execute() 
    .then(result => { 
     console.log(result.nModified) // This shows the number of edges that is actually modified 
     console.log(result.getModifiedIds()) // This is what I want to achieve 
    }) 

इसे प्राप्त करने का कोई तरीका?मोंगोड का उपयोग करके मोंगोडब के थोक संचालन से संशोधित आईडीएस प्राप्त करने का कोई तरीका?

उत्तर

2

अच्छी तरह से एक बिंदु से एवर "नहीं" है और इसके लिए एक बहुत अच्छा कारण है।

आम तौर पर, मोंगोडीबी "अपडेट" ऑपरेशंस का उद्देश्य आमतौर पर "एकाधिक" दस्तावेज़ों में काम करना है, इसलिए इसका मतलब है कि जो भी मानदंड मेल खाता है। तो यहां सामान्य मामला यह है कि जिसे आपने या तो एकवचन में अद्यतन करने के लिए कहा है या चयन द्वारा या तो अद्यतन किया गया था या नहीं, इस पर निर्भर करता है कि कुछ भी मेल खाता है या नहीं।

"थोक" संदर्भ में, वही बात लागू होती है, जिसमें एक मानदंड मैच था या नहीं, इस मामले में आपको nMatched और nModified के लिए मूल्य वापस लौटाया जाएगा, क्योंकि संभावना भी है कि एक "मिलान" दस्तावेज़ वास्तव में अद्यतन नहीं किया जाता है जहां संशोधित होने वाला डेटा पहले से ही मान है जो संशोधन का लक्ष्य है।

nMatched और nModified के बीच पिछले भेद प्रधानमंत्री कारण है कि "आप मज़बूती से ऐसा नहीं कर सकते", के बाद से नहीं सब कुछ का मिलान नहीं हुआ जरूरी संशोधित किया गया है है कि।

हालांकि आप "अपर्ट" क्रियाओं और वास्तविक "अपडेट" के बीच समझदार मामले में अतिथि मान बना सकते हैं। यह उल्लेखनीय भेदभाव के कारण 100% सटीक नहीं होगा, लेकिन मूल प्रक्रिया getUpsertedIds() से लौटाई गई मान पर आपकी इनपुट सूची की तुलना करना है, जो वैध कॉल है।

वर्तमान में दुनिया के बाकी हिस्सों के लिए ES6 वाक्य रचना दूर रहते हुए:

var upserted = result.getUpsertedIds(); // get this from the bulk result 

upserted = upserted.map(function(up) { return up._id }); // filter out just the _id values 

var modifiedIds = edges.map(function(edge) { // get _id only from source 
    return edge.id; 
}).filter(function(edge) { 
    return upserted.indexOf(edge) == -1;  // and return only non upserted 
}); 

कहाँ .getUpsertedIds() से की लौटे परिणाम दोनों बल्क अपडेट और उत्पन्न से "अनुक्रमणिका" स्थिति युक्त वस्तुओं की एक सरणी है या "अपरर्ट" के _id मूल्य की आपूर्ति की।

[ { index: 0, _id: 1 } ] 

तो "क्या वहाँ नहीं है", मूल रूप से चीजों को देता है कि जहां शायद सिर्फ संशोधित देखने के लिए "upserted" सूची के खिलाफ अपने इनपुट सूची मिलान। निश्चित रूप से चेतावनी के साथ कि यदि मान पहले से ही संशोधन के समान था, तो यह वास्तव में एक संशोधन नहीं था।

लेकिन एपीआई कैसे काम करने के लिए है, यह उतना करीब है जितना आप प्राप्त करने जा रहे हैं।

+0

विस्तारित उत्तर के लिए धन्यवाद। मुझे लगता है कि जानने का कोई तरीका नहीं है (वैसे भी थोक में) कौन से दस्तावेज जो वास्तव में संशोधित हो गए हैं, बस कुछ ने किया। – Martol1ni

+0

@ मार्टोल 1ni यह 'एनमोडिफाइड' के साथ सामान्य चेतावनी है (जिसे वास्तव में केवल नए थोक ऑपरेशंस एपीआई के तहत सही ढंग से रिपोर्ट किया गया है, क्योंकि विरासत एपीआई एक ही मूल्य के बावजूद संशोधित की गई है) जब तक कि आप एक समय में एक अपडेट को नहीं देख रहे हों (और एक दस्तावेज) यह वास्तव में संकेतक नहीं है कि 'nMatched' की तुलना में कितने दस्तावेज़ प्रभावित होते हैं। तो अगर –

+0

@BlakesSeven "के तहत" अंडर "की बजाय कुछ भी" ओवर "रिपोर्ट की जाएगी, तो मुझे लगता है कि आपका उदाहरण अपरिपक्व करने के लिए विशिष्ट है। क्या आप एक थोक खोज() अद्यतन() के लिए आईडी को वापस करने के विकल्प के बारे में सोच सकते हैं? – LPG

संबंधित मुद्दे