कैसे सभी मॉडल की गिनती करने के लिए?


101

मैं एक मॉडल की गिनती कैसे जान सकता हूं कि डेटा सहेजा गया है? की एक विधि है Model.count(), लेकिन यह काम नहीं करता है।

var db = mongoose.connect('mongodb://localhost/myApp');
var userSchema = new Schema({name:String,password:String});
userModel =db.model('UserList',userSchema);        
var userCount = userModel.count('name');

userCountएक वस्तु है, जिसे विधि कहा जाता है वह वास्तविक हो सकती है count?

धन्यवाद


1
यदि आप ES 2016 का उपयोग कर रहे हैं, तो आप कॉल को एक वादे के अंदर गिनने के लिए लपेट सकते हैं और इसे एक जनरेटर के साथ कॉल कर सकते हैं।
mikeyGlitz 1

जवाबों:


125

नीचे दिया गया कोड काम करता है। CountDocuments के उपयोग पर ध्यान दें ।

 var mongoose = require('mongoose');
 var db = mongoose.connect('mongodb://localhost/myApp');
 var userSchema = new mongoose.Schema({name:String,password:String});
 var userModel =db.model('userlists',userSchema);
 var anand = new userModel({ name: 'anand', password: 'abcd'});
 anand.save(function (err, docs) {
   if (err) {
       console.log('Error');
   } else {
       userModel.countDocuments({name: 'anand'}, function(err, c) {
           console.log('Count is ' + c);
      });
   }
 }); 

150

आपके कोड के काम न करने का कारण यह है कि गणना फ़ंक्शन अतुल्यकालिक है, यह तुल्यकालिक रूप से एक मान नहीं लौटाता है।

यहाँ उपयोग का एक उदाहरण है:

userModel.count({}, function( err, count){
    console.log( "Number of users:", count );
})

मुझे उदाहरण के लिए तुल्यकालिक तरीका गिनने का तरीका दीजिए
संस्कार मुनिअप्पा

मेरे लिए भी वैसा ही। मैं उसी की तलाश में हूँ
अब

11
countविधि से वंचित है, आप countDocumentsउसी वाक्यविन्यास का उपयोग कर सकते हैं
किर नोवाक

@KirNovak धन्यवाद भाई। मैं भी के लिए नेवला में यूआरएल प्रदान की निंदा
Tes3awy

25

Collection.count को हटा दिया गया है, और भविष्य के संस्करण में हटा दिया जाएगा। संग्रह का उपयोग करें। गिनती या संग्रह। इसके बजाय अनुमान

userModel.countDocuments(query).exec((err, count) => {
    if (err) {
        res.send(err);
        return;
    }

    res.json({ count: count });
});

3
यहाँ प्रलेखन लिंक है: mongoosejs.com/docs/api.html#model_Model.estimatedDocumentCount
babar78

मुझे समस्या थी, कि हमारी परियोजना में किसी भी संग्रह में मौजूदा वस्तुओं के लिए सेटअप नियमित परीक्षण। गिनती () पद्धति ने अजीब व्यवहार किया: जब संग्रह खाली नहीं था, तो कभी-कभी कुछ भी नहीं लौटता था (अपरिभाषित, अशक्त, शून्य या गलत - हम आगे इसकी जांच नहीं कर सकते थे)। हमें अभी भी यह पता नहीं चला है कि समस्या क्या थी क्योंकि यह एक दौड़ की स्थिति थी जो बहुत ही कम खुशी के साथ खुश थी। CountDocuments ({}) का उपयोग करना अब हमारे लिए काम करता है। धन्यवाद!
ha110_b1mm3lbahn

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a functionमुझे अपने उपयोगकर्तामॉडल पर इसका उपयोग करते समय एक त्रुटि मिलती है?
ल्यूक ब्राउन

हम "userModel.countDocuments" को सिंक्रोनस कॉल के रूप में कैसे बना सकते हैं ताकि मैं अपने दस्तावेज़ में कुछ "कुंजी और मूल्य" जोड़ने वाले स्कीमा में एक आभासी जोड़ सकूं।
सत्यम

25

आपको एक वस्तु को तर्क के रूप में देना चाहिए

userModel.count({name: "sam"});

या

userModel.count({name: "sam"}).exec(); //if you are using promise

या

userModel.count({}); // if you want to get all counts irrespective of the fields

हाल के संस्करण के मोंगोज़ पर, गिनती () का उपयोग किया गया है

userModel.countDocuments({name: "sam"});

2
DeprecationWarning: collection.count को पदावनत किया जाता है, आपको इसके बजाय .estimatedDocumentCC (या) orcountDocuments () का उपयोग करना चाहिए।
HMagdy

9

समाधान के लिए पृष्ठभूमि

जैसा कि मानगो दस्तावेज़ में और बेंजामिन द्वारा जवाब में कहा गया है, विधि 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();

स्टैकओवरफ्लोइंग द्वारा सीखना,


1

यहां सबसे अधिक वोट किए गए उत्तर पूरी तरह से ठीक हैं मैं सिर्फ प्रतीक्षा के उपयोग को जोड़ना चाहता हूं ताकि जो कार्यक्षमता मांगी गई है उसे संग्रहीत किया जा सके:

const documentCount = await userModel.count({});
console.log( "Number of users:", documentCount );

यह 'गणना ()' से अधिक होने पर काउंटड्रेक्शंस () का उपयोग करने की सिफारिश की जाती है, क्योंकि यह चल रहा है। तो, अब के लिए, सही कोड होगा:

const documentCount = await userModel.countDocuments({});
console.log( "Number of users:", documentCount );

-1

जैसा कि पहले कहा गया था, आप कोड उस तरह से काम नहीं करेंगे। इसका समाधान कॉलबैक फ़ंक्शन का उपयोग करना होगा, लेकिन यदि आपको लगता है कि यह आपको 'कॉलबैक नरक' तक ले जाएगा, तो आप "प्रोमिस" की खोज कर सकते हैं।

कॉलबैक फ़ंक्शन का उपयोग करके एक संभावित समाधान:

//DECLARE  numberofDocs OUT OF FUNCTIONS
     var  numberofDocs;
     userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

यदि आप किसी क्वेरी के आधार पर दस्तावेजों की संख्या खोजना चाहते हैं, तो आप ऐसा कर सकते हैं:

 userModel.count({yourQueryGoesHere}, setNumberofDocuments);

setNumberofDocuments एक अलग कार्य है:

var setNumberofDocuments = function(err, count){ 
        if(err) return handleError(err);

        numberofDocs = count;

      };

अब आप GetFunction के साथ कहीं भी दस्तावेज़ों की संख्या प्राप्त कर सकते हैं:

     function getNumberofDocs(){
           return numberofDocs;
        }
 var number = getNumberofDocs();

इसके अलावा, आप इस अतुल्यकालिक फ़ंक्शन का उपयोग कॉलबैक का उपयोग करके सिंक्रोनस के अंदर करते हैं, उदाहरण:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){

       userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection

       setNumberofDocuments(true);


} 

आशा है कि यह दूसरों की मदद कर सकता है। :)


फ़ंक्शन गणना में NumberOfDoc (), आप setNumberofDocuments (सही) क्यों कह रहे हैं? क्या वास्तविक त्रुटि वापस होने से पहले ही यह पहली बार त्रुटि नहीं करेगा?
प्रवीण
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.