2012-05-30 12 views
63

Come posso sapere il conteggio di un modello che i dati sono stati salvati? c'è un metodo di Model.count(), ma non sembra funzionare.Come ottenere il conteggio del modello di mangusta?

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 è un oggetto, quale metodo chiamato può ottenere un vero e proprio count?

Grazie

+0

Potrebbe mostrare un po 'di codice. – almypal

+0

Se si utilizza ES 2016, è possibile racchiudere la chiamata per contare all'interno di una promessa e chiamarla con un generatore. – mikeyGlitz

risposta

82

Il codice sotto funziona. Nota l'uso del conteggio.

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

Il motivo per il codice non funziona è perché la funzione di conteggio è asincrona, non restituisce un valore in modo sincrono.

Ecco un esempio di utilizzo:

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

Dammi un esempio per ottenere il metodo di conteggio sincrono del metodo –

1

Come detto prima, il codice non funziona così com'è. Una soluzione sarebbe utilizzare una funzione di callback, ma se pensi che ti porterebbe a un "callback hell", puoi cercare "Promisses".

Una possibile soluzione che utilizza una funzione di callback:

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

se si desidera cercare il numero di documenti basati su una query, si può fare questo:

userModel.count({yourQueryGoesHere}, setNumberofDocuments); 

setNumberofDocuments è una funzione separeted :

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

     numberofDocs = count; 

     }; 

Ora è possibile ottenere il numero di documenti ovunque con un get Funzione:

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

Inoltre, è possibile utilizzare questa funzione asincrona all'interno di uno sincrono utilizzando un callback, ad esempio:

function calculateNumberOfDoc(someParameter, setNumberofDocuments){ 

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

     setNumberofDocuments(true); 


} 

spero che possa aiutare gli altri. :)

+0

Nella funzione calculateNumberOfDoc(), perché stai chiamando setNumberofDocuments (true)? Non si otterrebbe prima un errore, anche prima che venga restituito il conteggio effettivo ?? – pravin

7

si dovrebbe dare un oggetto come argomento

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 
Problemi correlati