2012-05-30 5 views
63

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

Благодаря

+0

Не могли бы вы показать код. – almypal

+0

Если вы используете ES 2016, вы можете обернуть вызов для подсчета внутри обещания и вызвать его с помощью генератора. – mikeyGlitz

ответ

82

ниже код работает. Обратите внимание на использование счетчика.

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.count({name: 'anand'}, function(err, c) { 
      console.log('Count is ' + c); 
     }); 
    } 
}); 
110

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

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

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

Дайте мне пример, чтобы получить синхронный способ подсчета –

1

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

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

     numberofDocs = count; 

     }; 

Теперь вы можете получить количество документов в любом месте с помощью get Функция:

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

Кроме того, можно использовать эту функцию асинхронной внутри синхронный с помощью обратного вызова, примера:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){ 

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

     setNumberofDocuments(true); 


} 

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

+0

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

7

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

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 
Смежные вопросы