2017-01-10 8 views
5

इस क्वेरी में $ के साथ आईडी की एक सरणी का उपयोग कर एक से अधिक दस्तावेज़ को अद्यतन करने के ठीक काम कर रहा है:Upsert मुद्दा जब

db.collection.update(
    { "_id": oneIdProvided }, 
    { $inc: { "field": 5 } },{ upsert: true } 
) 

अब मैं एक ही आपरेशन भिन्न आईडी के साथ कई समय करना चाहते हैं, मैंने सोचा अच्छा तरीका में $ का इस्तेमाल किया गया है और इसलिए मैंने कोशिश की:

db.collection.update(
    { "_id": { $in: oneArrayOfIds} }, 
    { $inc: { "field": 5 } },{ upsert: true } 
) 

समस्या है: अगर सरणी में प्रदान की आईडी से एक संग्रह में मौजूदा नहीं है, एक नया दस्तावेज़ बनाई गई है (जो है जो मैं चाहता) लेकिन एक स्वचालित आईडी को जिम्मेदार ठहराया जाएगा, जो मैंने प्रदान की गई आईडी का उपयोग नहीं किया था और ढूंढ रहा था।

एक समाधान मैं देख रहा हूँ पहले आईडी मेरी सरणी के साथ एक डालने क्वेरी (उन पहले से ही विद्यमान संशोधित नहीं किया जाएगा) और फिर Upsert के साथ मेरे अद्यतन क्वेरी कर ऐसा करने के लिए हो सकता है: झूठी

आप का एक तरीका दिखाई दे रहा है ऐसा केवल एक प्रश्न में कर रहा है?

उत्तर

2

हम bulkWrite() विधि का उपयोग कर एकाधिक लेखन संचालन करके ऐसा कर सकते हैं।

function* range(start, end, step) { 
    for (let val=start; val<end; val+=step) 
     yield val 
} 

let oneArrayOfIds; // For example [1, 2, 3, 4] 

let bulkOp = oneArrayOfIds.map(id => { 
    return { 
     "updateOne": { 
      "filter": { "_id": id }, 
      "update": { "$set": { "field": 5 } }, 
      "upsert": true 
     } 
    }; 
}); 

const limit = 1000; 
const len = bulkOp.length; 

let chunks = []; 
if (len > 1000) { 
    for (let index of range(0, len, limit)) { 
     db.collection.bulkWrite(bulkOp.slice(index, index+limit)); 
    } 
} else { 
    db.collection.bulkWrite(bulkOp); 
} 
+0

धन्यवाद, bulkWrite() वास्तव में मैं यहां क्या खो रहा था। – Felwin

+1

त्वरित प्रश्न, आपके कोड उदाहरण में आप सीमा से बचने के लिए 1000 अनुरोधों के बैच बना रहे हैं, हालांकि [दस्तावेज़ीकरण] (https://docs.mongodb.com/manual/reference/limits/#Write-Command-Operation] के अनुसार -लिमिट-साइज) ड्राइवरों का उपयोग करते समय यह चरण आवश्यक नहीं है। क्या आप पुष्टि कर सकते हैं कि चालक वास्तव में उस हिस्से को संभालने में सक्षम हैं और मैं 1000 से अधिक वस्तुओं के साथ थोक लिख सकता हूं? – Felwin

+1

हां, आप 1000 से अधिक संचालन भेज सकते हैं और मोंगोडीबी 1000 के उप समूह में विभाजित करके आपके लिए नौकरी करेगा। लेकिन मैं इसे स्वयं करना पसंद करता हूं। – styvane

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