समाधान के लिए पृष्ठभूमि
जैसा कि मानगो दस्तावेज़ में और बेंजामिन द्वारा जवाब में कहा गया है, विधि Model.count()
पदावनत है। उपयोग करने के बजाय count()
, विकल्प निम्नलिखित हैं:
Model.countDocuments(filterObject, callback)
गणना करता है कि एक संग्रह में कितने दस्तावेज़ फ़िल्टर से मेल खाते हैं। खाली वस्तु {} को फ़िल्टर के रूप में पास करना पूर्ण संग्रह स्कैन को निष्पादित करता है। यदि संग्रह बड़ा है, तो निम्न विधि का उपयोग किया जा सकता है।
Model.estimatedDocumentCount()
यह मॉडल विधि MongoDB संग्रह में दस्तावेजों की संख्या का अनुमान लगाती है। यह विधि पिछले की तुलना में तेज़ है countDocuments()
, क्योंकि यह संपूर्ण संग्रह से गुजरने के बजाय संग्रह मेटाडेटा का उपयोग करती है। हालाँकि, जैसा कि विधि नाम से पता चलता है, और db विन्यास पर निर्भर करता है, परिणाम एक अनुमान है क्योंकि मेटाडाटा विधि निष्पादन क्षण में एक संग्रह में दस्तावेजों की वास्तविक गणना को प्रतिबिंबित नहीं कर सकता है।
दोनों विधियाँ एक mongoose क्वेरी ऑब्जेक्ट लौटाती हैं, जिसे निम्नलिखित दो तरीकों में से एक में निष्पादित किया जा सकता है। .exec()
यदि आप किसी क्वेरी को बाद में निष्पादित करना चाहते हैं तो इसका उपयोग करें ।
समाधान
विकल्प 1: कॉलबैक फ़ंक्शन पास करें
उदाहरण के लिए, संग्रह में सभी दस्तावेज़ों का उपयोग करके गणना करें .countDocuments()
:
someModel.countDocuments({}, function(err, docCount) {
if (err) { return handleError(err) } //handle possible errors
console.log(docCount)
//and do some other fancy stuff
})
या, एक निश्चित नाम का उपयोग करके एक संग्रह में सभी दस्तावेजों की गणना करें .countDocuments()
:
someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
//see other example
}
विकल्प 2: उपयोग करें .then()
एक .then()
मानसून क्वेरी में ऐसा "तत्कालीन" है। यह सुविधा के लिए है और क्वेरी स्वयं एक वादा नहीं है।
उदाहरण के लिए, संग्रह में सभी दस्तावेज़ों का उपयोग करके गणना करें .estimatedDocumentCount()
:
someModel
.estimatedDocumentCount()
.then(docCount => {
console.log(docCount)
//and do one super neat trick
})
.catch(err => {
//handle possible errors
})
विकल्प 3: Async / प्रतीक्षा का उपयोग करें
एसिंक्स / वेट अप्रोच का उपयोग करते समय, अनुशंसित तरीका इसका उपयोग करना है .exec()
क्योंकि यह बेहतर स्टैक निशान प्रदान करता है।
const docCount = await someModel.countDocuments({}).exec();
स्टैकओवरफ्लोइंग द्वारा सीखना,