2011-10-28 7 views
9

का उपयोग कर मोंगोडीबी में एकाधिक दस्तावेजों को अपडेट और अपरिवर्तित करने के लिए मैं मोंगोडीबी 2 का उपयोग कर रहा हूं, और मैं कई दस्तावेजों को अपडेट करना चाहता हूं और संग्रह में processed:true जैसे मूल्य को अपरिवर्तित करना चाहता हूं। लेकिन मोंगोडीबी सी # एपीआई केवल हमें एकाधिक रिकॉर्ड्स अपडेट करने या एक रिकॉर्ड को अप्सर्ट करने की अनुमति देता है।सी # ड्राइवर्स

सी # एपीआई का उपयोग करके इस समस्या को कैसे हल करें?

उत्तर

12

आप इसे एक कथन में नहीं कर सकते हैं।

आपके पास दो विकल्प

1) पाश सभी वस्तुओं से अधिक है और कर upserts

2) जो अद्यतन करने के लिए है यह पता लगाने की वस्तुओं और फिर सम्मिलित करने के लिए एक बैच डालने और एक बहु करते हैं जो अद्यतन

1

अपडेटफ्लैग सी # ड्राइवर में एक enum है जो आपको एक साथ दोनों निर्दिष्ट करने देगा। किसी भी अन्य झंडे की तरह, आप इसे थोड़ा "या" आईएनजी द्वारा करते हैं।

var flags = UpdateFlags.Upsert | UpdateFlags.Multi; 

आप यहाँ enums (http://msdn.microsoft.com/en-us/library/cc138362.aspx) बिट झंडे के रूप में गणन प्रकार पर अनुभाग के लिए विशेष ध्यान दे रही पर डॉक्स पढ़ सकते हैं

1

पहले संग्रह से सम्मिलित करने के लिए सभी वस्तुओं को हटाने, और फिर डालने से कॉल करके देखें:

 var search = []; 
     arrayToInsert.forEach(function(v, k) { 
      search.push(v.hash); // my unique key is hash. you could use _id or whatever 
     }) 
     collection.remove({ 
      'hash' : { 
       $in : search 
      } 
     }, function(e, docs) { 

      collection.insert(arrayToInsert, function(e, docs) { 
       if (e) { 
        console.log("data failed to update ", e); 
       } 
       else { 
        console.log("data updated "); 
       } 
      }); 
     }) 
+2

इसके साथ एक समस्या यह है कि संग्रह पढ़ने वाले क्लाइंट ऑपरेशन के दौरान गायब वस्तुओं को देख सकते हैं। यदि आपके ग्राहक इसे बर्दाश्त कर सकते हैं, तो यह एक उचित दृष्टिकोण प्रतीत होता है। –

14

Mongo 2.6 के बाद आप थोक Updates/Upserts कर सकते हैं। नीचे उदाहरण c# ड्राइवर का उपयोग कर थोक अद्यतन करता है।

MongoCollection<foo> collection = database.GetCollection<foo>(collectionName); 
     var bulk = collection.InitializeUnorderedBulkOperation(); 
     foreach (FooDoc fooDoc in fooDocsList) 
     { 
     var update = new UpdateDocument { {fooDoc.ToBsonDocument() } }; 
     bulk.Find(Query.EQ("_id", fooDoc.Id)).Upsert().UpdateOne(update); 
     } 
     BulkWriteResult bwr = bulk.Execute(); 
+0

हमारी विकास टीम -मोन्गोडीबी 3.0.0 और -मोन्गो डीबी सी # चालक संस्करण 1.7.0.4714 का उपयोग करती है। MongoDB सी # चालक संस्करण 1.7.0.4714 प्रारंभिक के बारे में शिकायत UnnorderedBulkOperation() अपरिभाषित किया जा रहा है। –

4

MongoDB.Driver के संस्करण 2.0 का उपयोग करने वालों के लिए, आप BulkWriteAsync विधि का उपयोग कर सकते।

<!-- language: c# --> 
// our example list 
List<Products> products = GetProductsFromSomewhere(); 

var collection = YourDatabase.GetCollection<BsonDocument>("products"); 

// initialise write model to hold list of our upsert tasks 
var models = new WriteModel<BsonDocument>[products.Count]; 

// use ReplaceOneModel with property IsUpsert set to true to upsert whole documents 
for (var i = 0; i < products.Count; i++){ 
    var bsonDoc = products[i].ToBsonDocument(); 
    models[i] = new ReplaceOneModel<BsonDocument>(new BsonDocument("aw_product_id", products[i].aw_product_id), bsonDoc) { IsUpsert = true }; 
}; 

await collection.BulkWriteAsync(models); 
+3

इससे मेरी मदद मिली। बहुत बहुत धन्यवाद। मेरे मामले में मुझे एक आईनेमरेबल मिलता है क्योंकि वस्तुओं को अपरिवर्तित किया जाता है। 'BulkWriteAsync' एक आईनेमरेबल लेता है, इसलिए मैंने इसे इस तरह से कुछ संशोधित किया:' var models = items.Select (item => new ReplaceOneModel (नया अभिव्यक्तिफिल्टरडिफिनिशन (दस्तावेज़ => doc.Id == item.Id), आइटम) {IsUpsert = true}); ' –

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