Tło rozwiązania
Jak stwierdzono w dokumentacji mangusty i w odpowiedzi Benjamina, metoda Model.count()
jest przestarzała. Zamiast używać count()
, alternatywy są następujące:
Model.countDocuments(filterObject, callback)
Oblicza, ile dokumentów pasuje do filtra w kolekcji. Przekazanie pustego obiektu {} jako filtru powoduje wykonanie pełnego skanowania kolekcji. Jeśli kolekcja jest duża, można użyć następującej metody.
Model.estimatedDocumentCount()
Ta metoda modelu szacuje liczbę dokumentów w kolekcji MongoDB. Ta metoda jest szybsza niż poprzednia countDocuments()
, ponieważ używa metadanych kolekcji zamiast przechodzić przez całą kolekcję. Jednak, jak sugeruje nazwa metody, w zależności od konfiguracji bazy danych, wynikiem jest oszacowanie, ponieważ metadane mogą nie odzwierciedlać faktycznej liczby dokumentów w kolekcji w momencie wykonywania metody.
Obie metody zwracają obiekt zapytania mongoose, który można wykonać na jeden z dwóch poniższych sposobów. Użyj, .exec()
jeśli chcesz wykonać zapytanie w późniejszym czasie.
Rozwiązanie
Opcja 1: Przekaż funkcję zwrotną
Na przykład policz wszystkie dokumenty w kolekcji, używając .countDocuments()
:
someModel.countDocuments({}, function(err, docCount) {
if (err) { return handleError(err) } //handle possible errors
console.log(docCount)
//and do some other fancy stuff
})
Lub policz wszystkie dokumenty w kolekcji o określonej nazwie, używając .countDocuments()
:
someModel.countDocuments({ name: 'Snow' }, function(err, docCount) {
//see other example
}
Opcja 2: Użyj .then()
Zapytanie .then()
o mangustę ma, więc jest „możliwe”. To jest dla wygody, a samo zapytanie nie jest obietnicą.
Na przykład policz wszystkie dokumenty w kolekcji, używając .estimatedDocumentCount()
:
someModel
.estimatedDocumentCount()
.then(docCount => {
console.log(docCount)
//and do one super neat trick
})
.catch(err => {
//handle possible errors
})
Opcja 3: użyj async / await
Korzystając z podejścia async / await, zalecanym sposobem jest użycie go z, .exec()
ponieważ zapewnia lepsze ślady stosu.
const docCount = await someModel.countDocuments({}).exec();
Nauka przez przepełnienie stosu,