Tüm firavun faresi modeli nasıl alınır?


101

Verilerin kaydedildiği bir modelin sayısını nasıl bilebilirim? bir yöntemi var Model.count()ama işe yaramıyor gibi görünüyor.

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

userCountbir nesnedir, hangi yöntem gerçek olabilir count?

Teşekkürler


1
ES 2016 kullanıyorsanız, çağrıyı bir sözün içinde saymak için sarabilir ve bir jeneratörle çağırabilirsiniz.
mikeyGlitz

Yanıtlar:


124

Aşağıdaki kod çalışır. CountDocuments kullanımına dikkat edin .

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

149

Kodunuzun çalışmamasının nedeni, sayma işlevinin eşzamansız olması, eşzamanlı olarak bir değer döndürmemesidir.

İşte bir kullanım örneği:

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

Sayım eşzamanlı yöntem yöntemini almak için bana örnek ver
sankar muniyappa

Benim için aynı. Ben de aynısını arıyorum
nowox

11
countyöntem depricated, countDocumentsaynı sözdizimini kullanabilirsiniz
Kir Novak

@KirNovak Teşekkürler kardeşim. Ayrıca url'yi kullanımdan kaldırma için firavun faresi olarak sağladım .
Tes3awy

27

Argüman olarak bir nesne vermelisiniz

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

veya

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

veya

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

Firavun faresinin son sürümünde count () kullanımdan kaldırılmıştır, bu nedenle şunu kullanın:

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

2
DeprecationWarning: collection.count kullanımdan kaldırıldı, bunun yerine .estimatedDocumentCount () veya .countDocuments () kullanmalısınız.
HMagdy

25

Collection.count kullanımdan kaldırıldı ve gelecekteki bir sürümde kaldırılacak. Koleksiyonu kullanın. countDocuments veya koleksiyon. estimatedDocumentCount yerine.

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

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


Problemi yaşadım, projemizde herhangi bir koleksiyondaki mevcut öğeler için bir kurulum rutin testi. Count () yöntemi garip davrandı: koleksiyon boş olmadığında bazen hiçbir şey döndürmedi (tanımsız, null, sıfır veya yanlış - daha fazla araştıramadık). Nadiren gerçekleşen bir yarış durumu olduğundan, soruna neyin neden olduğunu hala bulamadık. CountDocuments ({}) kullanmak artık bizim için çalışıyor. Teşekkür ederim!
ha110_b1mm3lbahn

UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a functionKendi userModel'imde kullanırken bir hata alıyorum?
Luke Brown

"UserModel.countDocuments" i eşzamanlı çağrı olarak nasıl yapabiliriz, böylece şemaya belgeme bazı "anahtar ve değer" ekleyen bir sanal ekleyebilirim.
Satyam

9

Çözüm için arka plan

Firavun faresi belgelerinde ve Benjamin'in yanıtında belirtildiği gibi, yöntem Model.count()kullanımdan kaldırılmıştır. Kullanmak yerine count()alternatifler şunlardır:

Model.countDocuments(filterObject, callback)

Bir koleksiyondaki filtreyle kaç belgenin eşleştiğini sayar. Filtre olarak boş bir nesne {} geçirmek, tam bir koleksiyon taraması yürütür. Koleksiyon büyükse, aşağıdaki yöntem kullanılabilir.

Model.estimatedDocumentCount()

Bu model yöntemi, MongoDB koleksiyonundaki belge sayısını tahmin eder. Bu yöntem öncekinden daha hızlıdır countDocuments(), çünkü tüm koleksiyon boyunca gitmek yerine koleksiyon meta verilerini kullanır. Ancak, yöntem adından da anlaşılacağı gibi ve db yapılandırmasına bağlı olarak, sonuç bir tahmindir, çünkü meta veriler, yöntem yürütme anında bir koleksiyondaki belgelerin gerçek sayısını yansıtmayabilir.

Her iki yöntem de, aşağıdaki iki yoldan biriyle yürütülebilen bir firavun faresi sorgu nesnesi döndürür. .exec()Daha sonra bir sorgu yürütmek istiyorsanız kullanın .

Çözüm

1. Seçenek: Geri arama işlevi iletme

Örneğin, aşağıdakileri kullanarak bir koleksiyondaki tüm belgeleri sayın .countDocuments():

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

Veya bir koleksiyondaki belirli bir ada sahip tüm belgeleri aşağıdakileri kullanarak sayın .countDocuments():

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

2. Seçenek: Kullanım .then()

.then()Firavun faresi sorguya sahiptir, bu nedenle "ayarlanabilir" dir. Bu bir kolaylık içindir ve sorgunun kendisi bir söz değildir.

Örneğin, aşağıdakileri kullanarak bir koleksiyondaki tüm belgeleri sayın .estimatedDocumentCount():

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

3. Seçenek: Eşzamansız / beklemeyi kullanma

Zaman uyumsuz / bekleme yaklaşımını kullanırken , daha iyi yığın izlemeleri sağladığı için önerilen yol, onu kullanmaktır .exec().

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

Yığın taşarak öğrenme,


1

Buradaki en yüksek oyu alan cevaplar tamamen iyidir. Bekleme kullanımını eklemek istiyorum, böylece istenen işlevsellik arşivlenebilir:

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

Kullanımdan kaldırılacağı için 'count ()' yerine countDocuments () kullanılması önerilir . Yani, şimdilik, mükemmel kod:

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

0

Mongoose.js kullanarak belgeleri sayabilirsiniz

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

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


-1

Daha önce de belirtildiği gibi, kodunuz olduğu gibi çalışmayacaktır. Buna bir çözüm, bir geri arama işlevi kullanmak olabilir, ancak bunun sizi bir 'Geri arama cehennemine' taşıyacağını düşünüyorsanız, "Sözler" i arayabilirsiniz.

Bir geri arama işlevi kullanan olası bir çözüm:

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

Bir sorguya göre belge sayısını aramak istiyorsanız, bunu yapabilirsiniz:

 userModel.count({yourQueryGoesHere}, setNumberofDocuments);

setNumberofDocuments ayrılmış bir işlevdir:

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

        numberofDocs = count;

      };

Şimdi bir getFunction ile her yerde Belge sayısını alabilirsiniz:

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

Ek olarak, bu eşzamansız işlevi bir geri arama kullanarak eşzamanlı işlev içinde kullanırsınız, örneğin:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){

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

       setNumberofDocuments(true);


} 

Umarım başkalarına yardım edebilir. :)


CalculateNumberOfDoc () işlevinde, neden setNumberofDocuments (true) öğesini çağırıyorsunuz? Asıl sayım döndürülmeden önce hatayla sonuçlanmaz mı ??
24'te pravin
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.