2015-09-19 9 views
14

में गिनती() और खोज()। गिनती() के बीच अंतर, मैं मूल रूप से mycollection में सभी दस्तावेजों को ढूंढना चाहता था। db.mycollection.count() बनाम db.mycollection.find().count()?मोंगोडीबी

वे दोनों एक ही परिणाम लौटाते हैं। क्या कोई कारण है कि कोई बनाम find().count() का चयन करेगा? इस तथ्य के विपरीत कि find() में एक डिफ़ॉल्ट सीमा लागू होती है (यदि मैं गलत हूं तो मुझे सही करें) जिसमें आपको खोल में और देखने के लिए "इसे" टाइप करना होगा।

+5

शैल में ब्रैकेट के बिना 'db.mycollection.count' टाइप करें और आपको अंतिम पंक्ति के साथ विधि कॉल को वापस भेज दिया जाएगा। ढूँढें (क्वेरी)। गणना(); 'जो मूल रूप से कहता है कि आपने विशेष रूप से "स्किप" या "सीमा" जैसे विशेष संशोधक शामिल किए हैं, फिर यह मूल रूप से एक ही कथन को निष्पादित कर रहा है, यहां तक ​​कि एक क्वेरी के साथ भी। कमांड फॉर्म में भी, अंतर्निहित निष्पादन में सार तत्व नहीं है। –

+2

खोल सुविधा के लिए परिणामों को छोटा कर देता है। मोंगोडीबी एपीआई वास्तव में कुछ भी कम नहीं करता है। दूसरे शब्दों में: 'ढूंढें()' की ऐसी कोई सीमा नहीं है। –

उत्तर

21

db.collection.count() संग्रह में दस्तावेजों की गणना देता है और db.collection.find().count()find() से दस्तावेजों से मेल खाते की संख्या देता है।

इस दस्तावेज में बहुत स्पष्ट है:

db.collection.count(query)

दस्तावेजों है कि एक find() क्वेरी से मेल खाते हैं की गणना देता है। db.collection.count() विधि find() ऑपरेशन निष्पादित नहीं करती है बल्कि इसकी गणना करता है और क्वेरी से मेल खाने वाले परिणामों की संख्या देता है।

cursor.count()

गिनता एक कर्सर द्वारा संदर्भित दस्तावेजों की संख्या। मेलिंग दस्तावेजों की संख्या वापस करने के लिए count() विधि find() क्वेरी में जोड़ें। ऑपरेशन क्वेरी नहीं करता है बल्कि इसके परिणामस्वरूप गणना करता है जो क्वेरी द्वारा वापस किया जाएगा।

इसके अलावा documentation में उल्लिखित:

एक sharded क्लस्टर पर, db.collection.count() एक गलत गिनती में परिणाम अगर अनाथ दस्तावेज मौजूद हैं या यदि एक हिस्सा प्रवास प्रगति पर है सकते हैं।

इन स्थितियों से बचने के लिए, एक शापित क्लस्टर पर, db.collection.aggregate() विधि के $ समूह चरण का उपयोग दस्तावेज़ों को $ योग करने के लिए करें।

11

db.collection.count() पैरामीटर के बिना किसी संग्रह में सभी दस्तावेजों की गणना करता है। पैरामीटर के बिना db.collection.find() संग्रह में सभी दस्तावेजों से मेल खाता है, और count() जोड़ना उन्हें गिना जाता है, इसलिए कोई अंतर नहीं है।

यह db.collection.count() documentation में स्पष्ट रूप से पुष्टि की है:

आदेश संग्रह में सभी दस्तावेजों की संख्या की गणना करने के लिए, निम्नलिखित आपरेशन का उपयोग करें:

db.orders.count()

इस आपरेशन के बराबर है निम्नलिखित:

db.orders.find().count()

1

जिस तरह से आप उनका उपयोग कर रहे हैं, वे दोनों एक ही परिणाम लौट रहे हैं, क्योंकि आप खोज() के लिए एक क्वेरीिंग मानदंड नहीं पारित कर रहे हैं।

2

जैसा कि शीलाक द्वारा एक और उत्तर में बताया गया है, दोनों बराबर हैं - सिवाय इसके कि db.collection.count() शेर्ड क्लस्टर के लिए गलत हो सकता है।

latest documentation का कहना है:

गिनती() db.collection.find (क्वेरी) .count() निर्माण के बराबर है।

और फिर,

Sharded क्लस्टर

एक sharded क्लस्टर पर, db.collection.count() अनाथ दस्तावेज मौजूद है, तो एक गलत गिनती में परिणाम कर सकते हैं या एक हिस्सा है, तो माइग्रेशन प्रगति पर है।

प्रलेखन बताता है कि इस bug (कुल योग का उपयोग कैसे करें) को कम करने के लिए।