2012-05-30 7 views
63

¿Cómo puedo saber el recuento de un modelo que los datos se han guardado? hay un método de Model.count(), pero parece que no funciona.¿Cómo obtener la cuenta del modelo de mangosta?

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 es un objeto, método que llama puede conseguir un verdadero count?

Gracias

+0

Podría mostrar algo de código. – almypal

+0

Si está utilizando ES 2016, puede ajustar la llamada para contar dentro de una promesa y llamarla con un generador. – mikeyGlitz

Respuesta

82

El código siguiente funciona. Tenga en cuenta el uso de contar.

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

La razón por la que su código no funciona es porque la función de recuento es asíncrona, no lo hace de forma sincrónica devolver un valor.

Aquí hay un ejemplo de uso:

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

Dame un ejemplo para obtener la cuenta del modo sincrónico del método –

1

Como se ha dicho antes, el código no funcionará de la manera que es. Una solución para eso sería usar una función de devolución de llamada, pero si crees que te llevaría a un "Infierno de devolución de llamada", puedes buscar "Promesas".

Una posible solución usando una función de devolución de llamada:

//DECLARE numberofDocs OUT OF FUNCTIONS 
    var numberofDocs; 
    userModel.count({}, setNumberofDocuments); //this search all DOcuments in a Collection 

si desea buscar el número de documentos en base a una consulta, se puede hacer esto:

userModel.count({yourQueryGoesHere}, setNumberofDocuments); 

setNumberofDocuments es una función separeted :

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

     numberofDocs = count; 

     }; 

Ahora puede obtener el número de Documentos en cualquier lugar con un get Función:

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

Además, se utiliza esta función asíncrona dentro de una sincrónica mediante el uso de una devolución de llamada, ejemplo:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){ 

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

     setNumberofDocuments(true); 


} 

esperan que los pueda ayudar a otros. :)

+0

En la función calculateNumberOfDoc(), ¿por qué estás llamando a setNumberofDocuments (true)? ¿No sería el primero en generar un error, incluso antes de que se devuelva el conteo real? – pravin

7

deben darle un objeto como argumento

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

o

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

o

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