Skąd mogę wiedzieć, ile modeli zostało zapisanych? jest metoda Model.count()
, ale wydaje się, że nie działa.
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
jest obiektem, która wywołana metoda może uzyskać wartość rzeczywistą count
?
Dzięki
Odpowiedzi:
Poniższy kod działa. Zwróć uwagę na użycie countDocuments .
źródło
Kod nie działa, ponieważ funkcja count jest asynchroniczna i nie zwraca synchronicznie wartości.
Oto przykład użycia:
źródło
count
metoda jest pozbawiona funkcji, możesz użyć tejcountDocuments
samej składniCollection.count jest przestarzała i zostanie usunięta w przyszłej wersji. Użyj kolekcji. countDocuments lub collection. Zamiast tego oszacowanoDocumentCount .
źródło
UnhandledPromiseRejectionWarning: TypeError: userModel.countDocuments is not a function
Występuje błąd podczas używania go na moim własnym modelu użytkownika?Jako argument należy podać obiekt
lub
lub
W najnowszej wersji mongoose funkcja count () jest przestarzała, więc użyj
źródło
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()
:Lub policz wszystkie dokumenty w kolekcji o określonej nazwie, używając
.countDocuments()
: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()
: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.Nauka przez przepełnienie stosu,
źródło
Najwyżej ocenione tutaj odpowiedzi są w porządku. Chcę tylko dodać użycie await, aby żądana funkcjonalność mogła zostać zarchiwizowana:
Zaleca się używanie funkcji countDocuments () zamiast funkcji „count ()”, ponieważ będzie ona przestarzała. Tak więc na razie idealny kod wyglądałby tak:
źródło
Jak wspomniano wcześniej, kod nie będzie działał tak, jak jest. Rozwiązaniem tego problemu byłoby użycie funkcji zwrotnej, ale jeśli myślisz, że zaprowadzi Cię to do „piekła oddzwonienia”, możesz wyszukać „Promisses”.
Możliwe rozwiązanie wykorzystujące funkcję zwrotną:
jeśli chcesz wyszukać liczbę dokumentów na podstawie zapytania, możesz to zrobić:
setNumberofDocuments to oddzielna funkcja:
Teraz możesz uzyskać liczbę dokumentów w dowolnym miejscu dzięki funkcji getFunction:
Ponadto tej funkcji asynchronicznej używa się wewnątrz funkcji synchronicznej, używając wywołania zwrotnego, na przykład:
Mam nadzieję, że może pomóc innym. :)
źródło