Как получить весь счет модели мангуста?

Как узнать количество моделей, которые были сохранены в памяти? существует метод 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?

Спасибо

Ответ 1

Код ниже работает. Обратите внимание на использование 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);
      });
   }
 }); 

Ответ 2

Причина, по которой ваш код не работает, заключается в том, что функция count асинхронна, она не возвращает значение синхронно.

Вот пример использования:

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

Ответ 3

Collection.count устарела и будет удалена в следующей версии. Вместо этого используйте коллекцию.countDocuments или коллекцию.timateDocumentCount.

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

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

Ответ 4

Вы должны дать объект в качестве аргумента

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

В последней версии mongoose count() устарела, поэтому используйте

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

Ответ 5

Как указано в документации mongoose и в ответе Бенджамина, метод Model.count() устарел. Вместо использования count() возможны следующие варианты:

Model.countDocuments(filterObject, callback)

Подсчитывает, сколько документов соответствует фильтру в коллекции. Передача пустого объекта {} в качестве фильтра выполняет полное сканирование коллекции. Если коллекция большая, можно использовать следующий метод.

Model.estimatedDocumentCount()

Этот метод модели оценивает количество документов в коллекции MongoDB. Этот метод быстрее, чем предыдущий countDocuments(), потому что он использует метаданные коллекции, а не просматривает всю коллекцию. Однако, как следует из названия метода, и в зависимости от конфигурации базы данных результат является оценочным, поскольку метаданные могут не отражать фактическое количество документов в коллекции на момент выполнения метода.

Оба метода возвращают объект запроса mongoose, который можно выполнить одним из следующих двух способов. Используйте .exec(), если вы хотите выполнить запрос позже.

1) передать функцию обратного вызова

Например, подсчитать все документы в коллекции, используя .countDocuments():

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

Или подсчитайте все документы в коллекции, имеющие определенное имя, с помощью .countDocuments():

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

2) Используйте .then()

У запроса мангусты есть .then(), поэтому его можно использовать. Это для удобства, а сам запрос не является обещанием.

Например, подсчитать все документы в коллекции, используя .estimatedDocumentCount():

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

Надеюсь, это поможет!

Ответ 6

Как уже говорилось, код не будет работать так, как он есть. Решение этой проблемы будет использовать функцию обратного вызова, но если вы считаете, что она перенесет вас в "Callback hell", вы можете найти "Promisses".

Возможное решение с использованием функции обратного вызова:

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


} 

Надеюсь, это поможет другим.:)