mongodb.countDocuments परिणाम सेट बड़ा होने पर धीमा होता है

उपयोगकर्ता संग्रह पर परीक्षण डेटा:

  • स्थिति के साथ 10M दस्तावेज़ 'active'
  • स्थिति वाले १०० हज़ार दस्तावेज़ 'inactive'

फ़ील्ड status को अनुक्रमित किया गया है {status: 1}

db.users.countDocuments({status: 'active'}) 2.91 सेकंड लेता है db.users.countDocuments({status: 'inactive'}) 0.018 सेकंड लेता है

मैं समझता/समझती हूं कि countDocuments परिणामों को खोजने और गिनने के लिए एक योग का उपयोग करता है।

estimatedDocumentCount() इस मामले में काम नहीं करता क्योंकि क्वेरी फ़िल्टर की आवश्यकता है

सुधार के लिए कोई सुझाव?

1
Chainarhong Dussadevanishaya 5 सितंबर 2019, 11:50

1 उत्तर

सबसे बढ़िया उत्तर

गिनती लगता है उन चीजों में से एक है जो सस्ती होनी चाहिए, लेकिन अक्सर नहीं होती है। चूंकि मोंगो अपने बी-ट्री इंडेक्स में कुछ मानदंडों से मेल खाने वाले दस्तावेजों की संख्या की गिनती नहीं रखता है, इसलिए इसे इंडेक्स गिनती दस्तावेजों के माध्यम से स्कैन करने की आवश्यकता होती है। इसका मतलब है कि १००x दस्तावेजों को गिनने में १०० गुना समय लगेगा, और मोटे तौर पर हम यहां यही देखते हैं -- 0.018 * 100 = 1.8s

इसे तेज करने के लिए, आपके पास कुछ विकल्प हैं:

  1. सक्रिय संख्या मोटे तौर पर estimatedDocumentCount() - db.users.countDocuments({status: 'inactive'}) है। क्या यह आपके उपयोग के मामले के लिए पर्याप्त सटीक होगा?
  2. वैकल्पिक रूप से, आप एक counts दस्तावेज़ को एक अलग संग्रह में रख सकते हैं जिसे आप अपने पास मौजूद सक्रिय/निष्क्रिय दस्तावेज़ों की संख्या के साथ समन्वयित रखते हैं।
2
willis 6 सितंबर 2019, 16:48