2013-02-15 21 views
9

javaDoc के अनुसार, getN() मोंगो डीबी-जावा में WriteResult वर्ग की विधि ऑपरेशन में अपडेट किए गए दस्तावेज़ों की संख्या लौटाती है। लेकिन यह हमेशा शून्य लौटाता है, भले ही दस्तावेज़ सही ढंग से डाला गया हो।मोंगो डीबी: WriteResult.getN() हमेशा 0 देता है?

ऐसा क्यों? या मैं इसे गलत समझ गया?

+0

यह ठीक से काम करता है। आप किस मोंगो संस्करण का उपयोग कर रहे हैं? क्या इस ऑपरेशन के बाद डीबी में दस्तावेज़ ठीक से डाले गए हैं? – Buchi

+1

हाँ दस्तावेजों को सही ढंग से डाला गया था! मोंगो संस्करण: 2.2.2 –

+1

मुझे भी वही चीज़ मिल रही है। यह 0 लौट रहा है। यहां देखें http: // stackoverflow।कॉम/प्रश्न/10662858/mongodb-java-api-writeresultgetn – btiernay

उत्तर

9

मैं धारणा है कि यह सामान्य MongoDB व्यवहार था के तहत किया गया है, और कुछ भी नहीं किया है जावा चालक के साथ करो।

केवल एक चीज मैं दस्तावेज में पा सकते हैं this है:

getLastError.n अपडेट करने या निकालने दस्तावेजों की संख्या बताता है, अगर पूर्ववर्ती आपरेशन का अपडेट था या ऑपरेशन को हटा दें।

एक insert जा रहा है न तो एक update और न ही एक remove, n निर्दिष्ट किया जा प्रतीत नहीं होता है और 0 किसी भी रूप में रूप में अच्छा एक डिफ़ॉल्ट मान है। आप देख सकते हैं यह आसानी से मोंगो खोल में पर्याप्त:

> db.test.insert({_id: 'test'}) 
> db.getLastErrorObj() 
{ "n" : 0, "connectionId" : 7, "err" : null, "ok" : 1 } 

जब तक मैं गलत कर रहा हूँ, यह वास्तव में एक मुद्दा है: अपने आप से पूछना है जो परिस्थितियों में डालने विफल हो जाएगा (जो एक राशि, कनेक्शन विफलता अन्य)। केवल एक जिसे मैं सोच सकता हूं वह एक समानता बाधा उल्लंघन है, जिसके परिणामस्वरूप अपवाद होगा। तो लगभग परिभाषा के अनुसार, तथ्य यह है कि आपको WriteResult उदाहरण प्राप्त होता है, इसका मतलब है कि ऑपरेशन सफल था और एक दस्तावेज़ डाला गया था।

कुछ नोट:

  • मेरे पिछले तर्क अपने WriteConcern पर्याप्त उच्च कि त्रुटियों रिपोर्ट कर रहे हैं किया जा रहा है पर निर्भर करता है। यदि आप WriteConcern.NONE का उपयोग कर रहे हैं, उदाहरण के लिए, कोई अपवाद कभी नहीं उठाया जाएगा।
  • यदि अपडेट किए गए दस्तावेज़ों की संख्या आपके लिए एक पूर्ण आवश्यक है, तो आप हमेशा insert के बजाय save का उपयोग कर सकते हैं। बहुत साफ नहीं है, लेकिन यह जिस तरह से आप अपेक्षा करते हैं उससे व्यवहार करता है।
+2

मुझे लगता है कि इस व्यवहार के साथ कोई समस्या है, क्योंकि 'getN()' के लिए जावाडोक कहता है "*" एन "फ़ील्ड प्राप्त करता है, जिसमें लेखन ऑपरेशन में प्रभावित दस्तावेज़ों की संख्या होती है। * यदि आप एक [unordered सम्मिलित करें] (http://docs.mongodb.org/manual/reference/method/db.collection.insert/#perform-an-unordered-insert), यह जानना महत्वपूर्ण है कि कुछ भी बदल गया है, और 'getN() का उपयोग करना 'फिर हमेशा आपके आवेदन में एक बग पेश करता है 0. एक समझदार समाधान (जावाडोक को सुधारने के अलावा)' getN() 'को आवेषण के लिए अपवाद फेंकने के लिए, या पहली जगह में विधि शामिल नहीं कर सकता! – Zero3

+0

@ Zero3 अनियंत्रित आवेषण इस उत्तर से अधिक हालिया हैं। Additionaly, WriteResult में 2.6 के बाद से सम्मिलित दस्तावेज़ों की संख्या शामिल है, मुझे विश्वास है कि आपको सही नाम के साथ getField को कॉल करने की आवश्यकता है। अंत में, सबसे हालिया जावाडोक एन फ़ील्ड के बारे में कुछ भी नहीं कहता है, यह बस 'एन फील्ड प्राप्त करें' कहता है। हालांकि यह बहुत उपयोगी नहीं है, यह शायद ही गलत है। और यदि आप एन फ़ील्ड के लिए आधिकारिक mongodb दस्तावेज़ीकरण को देखते हैं, तो यह स्पष्ट है कि आवेषण 0 का एन मान प्राप्त करेंगे - शायद सबसे अच्छा व्यवहार नहीं, बल्कि चश्मे के अनुसार सही एक। बस सही क्षेत्र का उपयोग करें। –

+0

[WriteResult] (http://api.mongodb.org/java/current/com/mongodb/WriteResult.html) में नवीनतम संस्करण में ऐसी कोई कार्यक्षमता नहीं है, और 'getN()' का विवरण ठीक है जैसा मैंने लिखा था । अपने लिए जांचें :)। – Zero3

1

तुम भी चिंता का विषय लिखने http://docs.mongodb.org/manual/core/write-concern/

dafault व्यवहार "सुरक्षित" का उपयोग नहीं कर रहा है की जाँच करने के लिए चाहते हो सकता

4

ध्यान दें कि क्या MongoDB documentation राज्यों की परवाह किए बिना, WriteResult.getN() विधि हमेशा 0 जावा ड्राइवर का उपयोग कर डालने के लिए देता है, डाला वस्तुओं की संख्या की परवाह किए बिना। जावा चालक की 2.12.3 में "n" क्षेत्र स्थापित करने के लिए स्रोत कोड:

if (type == INSERT) { 
    commandResult.put("n", 0); 
} else if (type == REMOVE) { 
    commandResult.put("n", bulkWriteResult.getRemovedCount()); 
} else if (type == UPDATE || type == REPLACE) { 
    commandResult.put("n", bulkWriteResult.getMatchedCount() + bulkWriteResult.getUpserts().size()); 
    if (bulkWriteResult.getMatchedCount() > 0) { 
    commandResult.put("updatedExisting", true); 
    } else { 
    commandResult.put("updatedExisting", false); 
    } 
    if (!bulkWriteResult.getUpserts().isEmpty()) { 
    commandResult.put("upserted", bulkWriteResult.getUpserts().get(0).getId()); 
    } 
} 

लेकिन त्रुटियों को सही ढंग से अपवाद के माध्यम से रिपोर्ट कर रहे हैं। उदाहरण के लिए, एक मोनोएक्सप्शन को एक दस्तावेज डालने पर फेंक दिया जाएगा जो एक अद्वितीय इंडेक्स का उल्लंघन करता है, यदि लिखित कॉनकर्न निर्दिष्ट है तो कम से कम ACKNOWLEDGED

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