মঙ্গস মডেলের সমস্ত গণনা কীভাবে পাবেন?


104

ডেটা সংরক্ষণ করা হয়েছে এমন কোনও মডেলের গণনা আমি কীভাবে জানতে পারি? একটি পদ্ধতি আছে 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?

ধন্যবাদ


4
আপনি যদি ES 2016 ব্যবহার করছেন তবে আপনি কোনও প্রতিশ্রুতিটির মধ্যে গণনা করতে কলটি মোড়ানো করতে পারেন এবং জেনারেটরের সাথে কল করতে পারেন।
মাইকিগ্লিটজ

উত্তর:


127

নীচের কোডটি কাজ করে। গণনাপত্রের ব্যবহার নোট করুন ।

 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);
      });
   }
 }); 

151

আপনার কোডটি কাজ না করার কারণ হ'ল গণনা ফাংশনটি অবিচ্ছিন্ন, এটি সিঙ্ক্রোনালি কোনও মান ফেরত দেয় না।

ব্যবহারের উদাহরণ এখানে:

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

পদ্ধতির সিঙ্ক্রোনাস পদ্ধতি গণনা করার জন্য আমাকে উদাহরণ দিন
শঙ্কর মুনিয়াপ্পা

আমার জন্যও একই. আমি একই সন্ধান করছি
এখন

13
countপদ্ধতিটি বর্ণিত হয়েছে, আপনি countDocumentsএকই বাক্য গঠন ব্যবহার করতে পারেন
কির নভাক

কিরনোভাক আমিও জন্য নকুল URL টি দেওয়া থামিয়ে দেওয়া
Tes3awy

27

আপনার যুক্তি হিসাবে কোনও বিষয় দেওয়া উচিত

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"});

4
অবচয়করণ সতর্কতা: সংগ্রহ.কাউন্টটি হ্রাস করা হয়েছে, আপনার পরিবর্তে .13matidocamentCount () বা .countDocuments () ব্যবহার করা উচিত।
এইচএমজিডি

26

কালেকশন.কাউন্টটি হ্রাস করা হয়েছে, এবং ভবিষ্যতের সংস্করণে সরানো হবে। সংগ্রহ ব্যবহার করুন। গণনাটুকু বা সংগ্রহ। পরিবর্তে ডকুমেন্টকাউন্টের অনুমান

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

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

4
এখানে ডকুমেন্টেশনের লিঙ্কটি রয়েছে: mongoosejs.com/docs/api.html#model_Model.estimatedDocamentCount
বাবর 78

আমার সমস্যা ছিল, আমাদের প্রকল্পে যে কোনও সংগ্রহের বিদ্যমান আইটেমগুলির জন্য একটি সেটআপ রুটিন পরীক্ষা। গণনা () পদ্ধতিটি অদ্ভুত আচরণ করেছিল: যখন সংগ্রহটি খালি ছিল না তখন এটি কখনও কখনও কিছুই ফেরত দেয় (অপরিজ্ঞাত, নাল, শূন্য বা মিথ্যা - আমরা এটি আরও তদন্ত করতে পারি না)। আমরা এখনও সমস্যাটি কী কারণে সৃষ্টি করিনি তা যেহেতু এটি এমন একটি দৌড় শর্ত ছিল যা খুব কমই সুখে থাকে। CountDocuments ({}) ব্যবহার এখন আমাদের জন্য কাজ করে। ধন্যবাদ!
ha110_b1mm3lbahn

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a functionএটি আমার নিজের ব্যবহারকারীমডলে ব্যবহার করার সময় আমি একটি ত্রুটি পেয়েছি?
লুক ব্রাউন

সিঙ্ক্রোনাস কল হিসাবে আমরা কীভাবে "ইউজারমোডেল কন্টাউন্ট ডকুমেন্টস" বানাতে পারি যাতে আমি স্কিমে একটি ভার্চুয়াল যুক্ত করতে পারি যা আমার নথিতে কিছু "কী ও মান" যুক্ত করে।
সত্যম

10

সমাধানের জন্য পটভূমি

যেমনটি মঙ্গুজের ডকুমেন্টেশনে এবং বেনজামিনের উত্তরে Model.count()বলা হয়েছে , পদ্ধতিটি হ্রাস করা হয়েছে। পরিবর্তে ব্যবহারের পরিবর্তে count()বিকল্পগুলি নিম্নলিখিত:

Model.countDocuments(filterObject, callback)

কোনও সংগ্রহের মধ্যে কতগুলি নথি ফিল্টারটির সাথে মেলে। ফিল্টার হিসাবে একটি খালি বস্তু {Pass পাস করা একটি সম্পূর্ণ সংগ্রহের স্ক্যান চালায়। সংগ্রহটি বড় হলে নিম্নলিখিত পদ্ধতিটি ব্যবহার করা যেতে পারে।

Model.estimatedDocumentCount()

এই মডেল পদ্ধতিটি মঙ্গোডিবি সংগ্রহের নথির সংখ্যা অনুমান করে। এই পদ্ধতিটি পূর্বের তুলনায় দ্রুত countDocuments(), কারণ এটি সম্পূর্ণ সংগ্রহের পরিবর্তে সংগ্রহের মেটাডেটা ব্যবহার করে। তবে, পদ্ধতির নামটি যেমন পরামর্শ দেয় এবং ডিবি কনফিগারেশনের উপর নির্ভর করে ফলাফলটি একটি প্রাক্কলন হিসাবে মেটাডেটা পদ্ধতি প্রয়োগের মুহুর্তে কোনও সংকলনে ডকুমেন্টের প্রকৃত গণনা প্রতিফলিত করতে পারে না।

উভয় পদ্ধতিই একটি মঙ্গুজ ক্যোয়ারী অবজেক্ট ফেরত দেয়, যা নিম্নলিখিত দুটি উপায়ে একটিতে কার্যকর করা যেতে পারে। .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 );

0

মঙ্গুজ.জেএস ব্যবহার করে আপনি দস্তাবেজগুলি গণনা করতে পারেন

const count = await Schema.countDocuments(); // count all

const count = await Schema.countDocuments({ key: value }); // count specific


-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);


} 

আশা করি এটি অন্যকে সহায়তা করতে পারে। :)


ফাংশন ক্যালকুলেট নাম্বারঅফডোক () এ, আপনি কেন সেট নাম্বারওফ ডকুমেন্টস (সত্য) বলছেন? প্রকৃত গণনা ফিরে আসার আগেই কি এটির আগে ত্রুটি হবে না ??
প্রবীণ
আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.