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

101

Как я могу узнать количество сохраненных данных модели? есть способ 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
Если вы используете ES 2016, вы можете заключить вызов count в обещание и вызвать его с помощью генератора.
mikeyGlitz

Ответы:

124

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

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

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

userModel.count({}, function( err, count){
    console.log( "Number of users:", count );
})
UpTheCreek
источник
Приведите мне пример для получения синхронного метода
подсчета
Мне то же. Ищу такую ​​же
nowox
11
countметод описан, вы можете использовать countDocumentsтот же синтаксис
Кир Новак
@KirNovak Спасибо, братан. Я также предоставил URL-адрес в мангусте для устаревания .
Tes3awy
27

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

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

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

userModel.countDocuments({name: "sam"});
Moh .S
источник
2
DeprecationWarning: collection.count устарел, вместо него следует использовать .estimatedDocumentCount () или .countDocuments ().
HMagdy
25

Collection.count устарел и будет удален в будущей версии. Используйте коллекцию. countDocuments или коллекции. РасчетныйДокументКаунт вместо этого.

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

    res.json({ count: count });
});
Бенджамин
источник
3
вот ссылка на документацию: mongoosejs.com/docs/api.html#model_Model.estimatedDocumentCount
babar78
У меня была проблема, что в нашем проекте есть настройка рутинных тестов для существующих предметов в любых коллекциях. Метод count () вёл себя странно: когда коллекция не была пустой, он иногда ничего не возвращал (undefined, null, ноль или false - мы не могли исследовать это дальше). Мы до сих пор не выяснили, что вызвало проблему, поскольку это была гонка, которая возникала очень редко. Использование countDocuments ({}) теперь работает для нас. Спасибо!
ha110_b1mm3lbahn
UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a functionЯ получаю сообщение об ошибке при использовании в моей пользовательской модели?
Люк Браун
Как мы можем сделать "userModel.countDocuments" синхронным вызовом, чтобы я мог добавить виртуальный объект в схему, который добавляет некоторый "ключ и значение" в мой документ.
Satyam
9

Фон для решения

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

Model.countDocuments(filterObject, callback)

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

Model.estimatedDocumentCount()

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

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

Решение

Вариант 1. Передайте функцию обратного вызова

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

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

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

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

Вариант 2: использовать .then()

В запросе мангуста .then()он «пригоден для употребления». Это сделано для удобства, и сам запрос не является обещанием.

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

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

Вариант 3: используйте async / await

При использовании подхода async / await рекомендуется использовать его, .exec()поскольку он обеспечивает лучшую трассировку стека.

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

Обучение путем переполнения стека,

Heilala
источник
1

Ответы, получившие наибольшее количество голосов, здесь совершенно нормальны, я просто хочу добавить использование await, чтобы запрошенные функции можно было заархивировать:

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

Рекомендуется использовать countDocuments () вместо count (), поскольку в дальнейшем это будет устаревшим. Итак, на данный момент идеальный код будет:

const documentCount = await userModel.countDocuments({});
console.log( "Number of users:", documentCount );
Мридул Трипати
источник
0

Используя mongoose.js, вы можете считать документы

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

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

Ставка
источник
-1

Как было сказано ранее, ваш код не будет работать так, как есть. Решением этого может быть использование функции обратного вызова, но если вы думаете, что это приведет вас в «ад обратного вызова», вы можете выполнить поиск по запросу «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);


} 

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

AndBecaPine
источник
Почему в функции calculateNumberOfDoc () вы вызываете setNumberofDocuments (true)? Не приведет ли это сначала к ошибке, даже до того, как будет возвращено фактическое количество ??
pravin