Sfondo per la soluzione
Come affermato nella documentazione di mongoose e nella risposta di Benjamin, il metodo Model.count()
è deprecato. Invece di utilizzare count()
, le alternative sono le seguenti:
Model.countDocuments(filterObject, callback)
Conta quanti documenti corrispondono al filtro in una raccolta. Il passaggio di un oggetto vuoto {} come filtro esegue una scansione completa della raccolta. Se la raccolta è grande, potrebbe essere utilizzato il seguente metodo.
Model.estimatedDocumentCount()
Questo metodo modello stima il numero di documenti nella raccolta MongoDB. Questo metodo è più veloce del precedente countDocuments()
, perché utilizza i metadati della raccolta invece di passare attraverso l'intera raccolta. Tuttavia, come suggerisce il nome del metodo e in base alla configurazione del database, il risultato è una stima poiché i metadati potrebbero non riflettere il conteggio effettivo dei documenti in una raccolta al momento dell'esecuzione del metodo.
Entrambi i metodi restituiscono un oggetto query mongoose, che può essere eseguito in uno dei due modi seguenti. Utilizzare .exec()
se si desidera eseguire una query in un secondo momento.
La soluzione
Opzione 1: passare una funzione di callback
Ad esempio, conta tutti i documenti in una raccolta utilizzando .countDocuments()
:
someModel.countDocuments({}, function(err, docCount) {
if (err) { return handleError(err) } //handle possible errors
console.log(docCount)
//and do some other fancy stuff
})
In alternativa, conta tutti i documenti in una raccolta con un determinato nome utilizzando .countDocuments()
:
someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
//see other example
}
Opzione 2: utilizzare .then()
Una query mangusta ha .then()
quindi è "quindi modificabile". Questo è per comodità e la query in sé non è una promessa.
Ad esempio, conta tutti i documenti in una raccolta utilizzando .estimatedDocumentCount()
:
someModel
.estimatedDocumentCount()
.then(docCount => {
console.log(docCount)
//and do one super neat trick
})
.catch(err => {
//handle possible errors
})
Opzione 3: usa async / await
Quando si usa l'approccio async / await, il modo consigliato è usarlo con .exec()
in quanto fornisce migliori tracce dello stack.
const docCount = await someModel.countDocuments({}).exec();
Imparando da stackoverflow,