Hintergrund für die Lösung
Wie in der Mungo-Dokumentation und in der Antwort von Benjamin angegeben, ist die Methode Model.count()
veraltet. Anstatt zu verwenden count()
, sind die Alternativen die folgenden:
Model.countDocuments(filterObject, callback)
Zählt, wie viele Dokumente mit dem Filter in einer Sammlung übereinstimmen. Wenn Sie ein leeres Objekt {} als Filter übergeben, wird ein vollständiger Sammlungsscan ausgeführt. Wenn die Sammlung groß ist, kann die folgende Methode verwendet werden.
Model.estimatedDocumentCount()
Diese Modellmethode schätzt die Anzahl der Dokumente in der MongoDB-Sammlung. Diese Methode ist schneller als die vorherige countDocuments()
, da Sammlungsmetadaten verwendet werden, anstatt die gesamte Sammlung zu durchlaufen. Wie der Methodenname andeutet und abhängig von der Datenbankkonfiguration, ist das Ergebnis eine Schätzung, da die Metadaten möglicherweise nicht die tatsächliche Anzahl der Dokumente in einer Sammlung zum Zeitpunkt der Methodenausführung widerspiegeln.
Beide Methoden geben ein Mungo-Abfrageobjekt zurück, das auf eine der folgenden zwei Arten ausgeführt werden kann. Verwenden .exec()
Sie diese Option, wenn Sie eine Abfrage zu einem späteren Zeitpunkt ausführen möchten.
Die Lösung
Option 1: Übergeben Sie eine Rückruffunktion
Zählen Sie beispielsweise alle Dokumente in einer Sammlung mit .countDocuments()
:
someModel.countDocuments({}, function(err, docCount) {
if (err) { return handleError(err) } //handle possible errors
console.log(docCount)
//and do some other fancy stuff
})
Oder zählen Sie alle Dokumente in einer Sammlung mit einem bestimmten Namen mit .countDocuments()
:
someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
//see other example
}
Option 2: Verwenden .then()
Eine Mungo-Abfrage hat .then()
also "thenable". Dies dient der Bequemlichkeit und die Abfrage selbst ist kein Versprechen.
Zählen Sie beispielsweise alle Dokumente in einer Sammlung mit .estimatedDocumentCount()
:
someModel
.estimatedDocumentCount()
.then(docCount => {
console.log(docCount)
//and do one super neat trick
})
.catch(err => {
//handle possible errors
})
Option 3: Verwenden Sie async / await
Wenn Sie den asynchronen / wartenden Ansatz verwenden, wird empfohlen , ihn mit zu verwenden, .exec()
da er bessere Stapelspuren bietet.
const docCount = await someModel.countDocuments({}).exec();
Lernen durch Stapelüberlauf,