Bagaimana cara mendapatkan semua hitungan model luwak?


101

Bagaimana saya bisa mengetahui hitungan model yang datanya telah disimpan? ada metode Model.count(), tetapi tampaknya tidak berhasil.

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

userCountitu sebuah Object, yang disebut method bisa mendapatkan real count?

Terima kasih


1
Jika Anda menggunakan ES 2016, Anda dapat menggabungkan panggilan untuk menghitung dalam janji dan memanggilnya dengan generator.
mikeyGlitz

Jawaban:


125

Kode di bawah berfungsi. Perhatikan penggunaan 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

Alasan kode Anda tidak berfungsi adalah karena fungsi count asynchronous, itu tidak mengembalikan nilai secara sinkron.

Berikut contoh penggunaan:

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

Beri saya contoh untuk mendapatkan cara menghitung sinkron metode
sankar muniyappa

Sama untuk ku. Saya mencari yang sama
nowox

11
countmetode depricated, Anda dapat menggunakan countDocumentssintaks yang sama
Kir Novak

@Tokopedia Saya juga memberikan url di luwak untuk penghentian .
Tes3awy

25

Collection.count tidak digunakan lagi, dan akan dihapus pada versi mendatang. Gunakan koleksi. countDocuments atau collection. estimDocumentCount sebagai gantinya.

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

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


Saya punya masalah, bahwa dalam proyek kami tes rutin pengaturan untuk item yang ada di koleksi apa pun. Metode count () berperilaku aneh: ketika koleksi tidak kosong, terkadang tidak mengembalikan apa pun (tidak ditentukan, null, nol, atau salah - kami tidak dapat menyelidikinya lebih lanjut). Kami masih belum menemukan penyebabnya karena itu adalah kondisi balapan yang sangat jarang terjadi. Menggunakan countDocuments ({}) sekarang bekerja untuk kita. Terima kasih!
ha110_b1mm3lbahn

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a functionSaya mendapatkan kesalahan saat menggunakannya di userModel saya sendiri?
Luke Brown

Bagaimana kita bisa membuat "userModel.countDocuments" sebagai panggilan sinkron sehingga saya dapat menambahkan virtual ke skema yang menambahkan beberapa "kunci & nilai" dalam dokumen saya.
Satyam

25

Anda harus memberikan objek sebagai argumen

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

atau

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

atau

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

Pada luwak versi terbaru, count () sudah tidak digunakan lagi, jadi gunakan

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

2
DeprecationWarning: collection.count tidak digunakan lagi, Anda harus menggunakan .estimatedDocumentCount () atau .countDocuments () sebagai gantinya.
HMagdy

9

Latar belakang solusinya

Seperti yang dinyatakan dalam dokumentasi luwak dan dalam jawaban Benjamin, metode Model.count()ini tidak digunakan lagi. Alih-alih menggunakan count(), alternatifnya adalah sebagai berikut:

Model.countDocuments(filterObject, callback)

Menghitung berapa banyak dokumen yang cocok dengan filter dalam koleksi. Meneruskan objek kosong {} sebagai filter menjalankan pemindaian koleksi lengkap. Jika koleksinya besar, metode berikut dapat digunakan.

Model.estimatedDocumentCount()

Metode model ini memperkirakan jumlah dokumen dalam koleksi MongoDB. Metode ini lebih cepat daripada sebelumnya countDocuments(), karena menggunakan metadata koleksi alih-alih melalui seluruh koleksi. Namun, seperti yang disarankan oleh nama metode, dan bergantung pada konfigurasi db, hasilnya adalah perkiraan karena metadata mungkin tidak mencerminkan jumlah sebenarnya dari dokumen dalam koleksi pada saat eksekusi metode.

Kedua metode mengembalikan objek kueri luwak, yang dapat dieksekusi dengan salah satu dari dua cara berikut. Gunakan .exec()jika Anda ingin mengeksekusi kueri di lain waktu.

Solusinya

Opsi 1: Meneruskan fungsi panggilan balik

Misalnya, hitung semua dokumen dalam sebuah koleksi menggunakan .countDocuments():

someModel.countDocuments({}, function(err, docCount) {
    if (err) { return handleError(err) } //handle possible errors
    console.log(docCount)
    //and do some other fancy stuff
})

Atau, hitung semua dokumen dalam koleksi yang memiliki nama tertentu menggunakan .countDocuments():

someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
    //see other example
}

Opsi 2: Gunakan .then()

Kueri luwak .then()jadi "dapat diterima". Ini untuk kenyamanan dan permintaan itu sendiri bukanlah janji.

Misalnya, hitung semua dokumen dalam sebuah koleksi menggunakan .estimatedDocumentCount():

someModel
    .estimatedDocumentCount()
    .then(docCount => {
        console.log(docCount)
        //and do one super neat trick
    })
    .catch(err => {
        //handle possible errors
    })

Opsi 3: Gunakan async / await

Saat menggunakan pendekatan async / await, cara yang disarankan adalah menggunakannya karena pendekatan .exec()ini menyediakan pelacakan tumpukan yang lebih baik.

const docCount = await someModel.countDocuments({}).exec();

Belajar dengan stackoverflowing,


1

Jawaban pilihan tertinggi di sini baik-baik saja. Saya hanya ingin menambahkan penggunaan menunggu sehingga fungsionalitas yang diminta dapat diarsipkan:

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

Direkomendasikan untuk menggunakan countDocuments () di atas 'count ()' karena tidak akan digunakan lagi. Jadi, untuk saat ini, kode yang tepat adalah:

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

-1

Seperti yang dikatakan sebelumnya, kode Anda tidak akan berfungsi sebagaimana mestinya. Solusi untuk itu akan menggunakan fungsi panggilan balik, tetapi jika Anda pikir itu akan membawa Anda ke 'neraka panggilan balik', Anda dapat mencari "Janji".

Solusi yang mungkin menggunakan fungsi panggilan balik:

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

Jika Anda ingin mencari jumlah dokumen berdasarkan query, Anda dapat melakukan ini:

 userModel.count({yourQueryGoesHere}, setNumberofDocuments);

setNumberofDocuments adalah fungsi terpisah:

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

        numberofDocs = count;

      };

Sekarang Anda bisa mendapatkan jumlah Dokumen di mana saja dengan getFungsi:

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

Selain itu, Anda menggunakan fungsi asinkron ini di dalam fungsi sinkron dengan menggunakan callback, contoh:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){

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

       setNumberofDocuments(true);


} 

Semoga bisa membantu orang lain. :)


Dalam fungsi countNumberOfDoc (), mengapa Anda memanggil setNumberofDocuments (true)? Bukankah itu akan menghasilkan kesalahan terlebih dahulu, bahkan sebelum penghitungan sebenarnya dikembalikan ??
pravin
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.