web-dev-qa-db-fra.com

Comment obtenir tout le compte du modèle mangouste?

Comment connaître le nombre de modèles sauvegardés dans un modèle? il existe une méthode de Model.count(), mais elle ne semble pas fonctionner.

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 est un objet, quelle méthode appelée peut obtenir un réel count?

Merci

86
smilexu

Le code ci-dessous fonctionne. Notez l'utilisation de 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);
      });
   }
 }); 
107
almypal

La raison pour laquelle votre code ne fonctionne pas, c'est parce que la fonction de comptage est asynchrone, elle ne renvoie pas de manière synchrone une valeur.

Voici un exemple d'utilisation:

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

Collection.count est obsolète et sera supprimé dans une version ultérieure. Utilisez collection .countDocuments ou collection .EstiméDocumentCount à la place.

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

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

Vous devriez donner un objet comme argument

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

ou

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

ou

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

Count () est obsolète dans la version récente de mangouste, utilisez donc

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

Comme indiqué dans la documentation sur les mangoustes et dans la réponse de Benjamin, la méthode Model.count () est obsolète. Au lieu d'utiliser count (), les alternatives sont les suivantes:

Model.countDocuments (filterObject, rappel)

Compte le nombre de documents correspondant au filtre dans une collection. Passer un objet vide {} en tant que filtre exécute une analyse complète de la collection. Si la collection est grande, la méthode suivante peut être utilisée.

Model.estimatedDocumentCount ()

Cette méthode modèle estime le nombre de documents de la collection MongoDB. Cette méthode est plus rapide que la précédente countDocuments (), car elle utilise des métadonnées de collection au lieu de parcourir l'intégralité de la collection. Toutefois, comme le nom de la méthode le suggère et en fonction de la configuration de la base de données, le résultat est une estimation, car les métadonnées peuvent ne pas refléter le nombre réel de documents dans une collection au moment de l'exécution de la méthode.

Les deux méthodes renvoient un objet de requête mangouste, qui peut être exécuté de l'une des deux manières suivantes. Utilisez .exec () si vous souhaitez exécuter une requête ultérieurement.

1) Passer une fonction de rappel

Par exemple, comptez tous les documents d'une collection à l'aide de .countDocuments ():

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

Ou, comptez tous les documents d'une collection portant un certain nom à l'aide de .countDocuments ():

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

2) Utilisez .then ()

Une requête de mangouste a .then () donc elle est "alors". C'est pour la commodité et l'interrogation elle-même n'est pas une promesse.

Par exemple, comptez tous les documents d'une collection à l'aide de .estimatedDocumentCount ():

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

J'espère que cela t'aides!

7
heilala