web-dev-qa-db-fra.com

Comment obtenir le numéro de document Mongoose?

Je travaille sur une application Nodejs/Express/Mongoose et je souhaitais implémenter une fonctionnalité d'auto-incrémentation en incrémentant le nombre de documents enregistrés, mais je ne parviens pas à obtenir ce nombre, car la méthode Mongoose 'count' ne renvoyer le numéro:

var number = Model.count({}, function(count){ return count;});

Est-ce que quelqu'un a réussi à obtenir le compte? Aidez-moi, s'il vous plaît.

16
kaizer

La fonction count est asynchrone, elle ne renvoie pas de manière synchrone une valeur. Exemple d'utilisation:

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

Vous pouvez également essayer de l'enchaîner après une find():

Model.find().count(function(err, count){
    console.log("Number of docs: ", count );
});

METTRE À JOUR:

Comme suggéré par @Creynders, si vous essayez d'implémenter une valeur incrémentielle automatique, il serait intéressant d'examiner le plugin mongoose-auto-increment:

Exemple d'utilisation:

var Book = connection.model('Book', bookSchema);
Book.nextCount(function(err, count) {

    // count === 0 -> true 

    var book = new Book();
    book.save(function(err) {

        // book._id === 0 -> true 

        book.nextCount(function(err, count) {

            // count === 1 -> true 

        });
    });
});
27
chridam

Si vous utilisez node.js> = 8.0 et Mongoose> = 4.0, vous devez utiliser await.

const number = await Model.count();
console.log(number);
5
Vasyl Boroviak

vous devez attendre la fonction de rappel 

Model.count({}, function(err , count){
  var number = count;
  console.log(number);
});

en JavaScript 

setTimeout(function() {
  console.log('a');
}, 0);

console.log("b");

le "b" sera imprimé avant "a" parce que 

console.log('a')
1
hussam

Il semble que vous vous attendiez à ce que var number contienne la valeur count. Dans votre fonction de rappel, vous renvoyez count, mais ceci est exécuté de manière asynchrone afin que la valeur ne soit pas affectée.

En outre, votre premier paramètre dans votre fonction de rappel devrait être err.

Par exemple:

var number = Model.count({}, function(err, count) {
    console.log(count); // this will print the count to console
});

console.log(number); // This will NOT print the count to console
0
JoGoFo