2012-02-22 5 views
5

मोंगोडीबी और नवीनतम 10gen सी # ड्राइवर (CSharpDriver-1.3.1.4349) का उपयोग करके, मैं "जगह में" अद्यतन करने की कोशिश कर रहा हूं और परिणाम में प्रभावित दस्तावेज़ों के # वापस प्राप्त करने का प्रयास कर रहा हूं।सुरक्षित संदेश

public static long SaveListings(string state, bool isActive, DateTime updateDate) 
{ 
    var result = Collection().Update(
    Query.And(
     Query.EQ("State", state), 
     Query.And(
      Query.EQ("IsActive", isActive), 
      Query.LT("UpdateDate", updateDate))), 
    Update.Set("IsActive", false), UpdateFlags.Multi); 
    return result != null ? result.DocumentsAffected : -1; 
} 

परिणाम कुछ कारणों से शून्य है।

db.Listing.update({ State: state.Abbreviation, IsActive: true, UpdateDate: { $lt: expiredDate } }, { $set: { IsActive: false } }, false, true); 
var numRows = db.getLastErrorObj().n; 

किसी भी विचार मैं गलत क्या कर रहा है या इस सी # चालक में एक बग है: यदि मैं console से कर रहे थे, मैं यह कर रहा से प्रभावित पंक्तियों की संख्या मिल सकती है?

उत्तर

6

अद्यतन में ओवरलोडेड विधि है जो SafeMode लेती है। बस अपने अद्यतन करने के लिए चौथे पैरामीटर के रूप में अपने कोड में जोड़ दें और शून्य नहीं होना चाहिए:

... 
UpdateFlags.Multi, 
SafeMode.True); 

ड्राइवर बग नहीं है यही कारण है कि, यह उम्मीद के रूप में काम करते हैं। मोंगोड दस्तावेज़ के लिए इंतजार नहीं करता है अगर सुरक्षित मोड के बिना डाला जाता है (इसलिए चालक वापसी शून्य), लेकिन यदि आप सुरक्षित मोड = सत्य कह रहे हैं - तो जब तक दस्तावेज़ डालने तक आप mongodb प्रतीक्षा करते हैं।

+0

धन्यवाद! मुझे पता है कि सुरक्षित मोड कैसे काम करता है हालांकि मैंने गलत तरीके से माना है कि कनेक्शन डिफ़ॉल्ट रूप से सुरक्षित मोड का उपयोग करेगा। – Justin

+0

मुझे एक ही समस्या थी, सावधान रहें कि मौजूदा ड्राइवर को GetLastError का उपयोग करते समय प्रमाणीकरण के साथ समस्या है। रॉबर्ट (10gen पर देव) सुरक्षित मोड का उपयोग करने की सिफारिश करते हैं। इसके बजाय प्रोब तय होने तक। https://jira.mongodb.org/browse/CSHARP-390 देखें – sambomartin

4

सुरक्षित मोड निर्दिष्ट किए बिना आवेषण और अद्यतन करना शून्य उत्पन्न होता है क्योंकि वे असीमित परिचालन होते हैं - यह जानने का कोई तरीका नहीं है कि सम्मिलन या अद्यतन कैसे चला गया।

इसलिए, उदा। SafeMode। उन मामलों में सम्मिलन और अपडेट में अंतिम तर्क के रूप में जहां आप परिणाम की परवाह करते हैं।

var result = collection.Update(query, update, SafeMode.True); 

आप कुछ और के बारे में getLastError और विभिन्न सुरक्षित मोड here (general) और here (SafeMode with the C# driver) पढ़ सकते हैं: यह ड्राइवर मुद्दा एक getLastError आदेश है, जो ब्लॉक जब तक सम्मिलित/अद्यतन पूरा कर लिया है कर देगा।