MongoDB oferuje różne metody liczenia dokumentów w kolekcji lub widoku. Istnieje również kilka operatorów agregacji, które umożliwiają zliczanie dokumentów przychodzących z poprzedniego etapu potoku agregacji.
W tym artykule przedstawiono następujące sposoby liczenia dokumentów w powłoce mongo:
count
poleceniedb.collection.count()
metodadb.collection.countDocuments()
metodadb.collection.estimatedDocumentCount()
metodacursor.count()
metoda$count
operator potoku agregacji$sortByCount
operator potoku agregacji
count
Polecenie
count
polecenie zlicza liczbę dokumentów w kolekcji lub widoku.
Przykład:
db.runCommand( {
count: "pets",
query: { type: "Dog" }
} )
Wynik:
{ "n" : 4, "ok" : 1 }
W tym przykładzie widzimy, że w grupie pets
znajdują się cztery psy kolekcja.
Widzimy również, że zwraca dokument, który zawiera liczbę oraz status polecenia.
db.collection.count()
Metoda
db.collection.count()
metoda zwraca liczbę dokumentów, które pasują do find()
zapytanie dotyczące kolekcji lub widoku.
collection
część to nazwa kolekcji lub widoku do wykonania operacji liczenia.
db.collection.count()
method jest opakowującą metodą dla count
polecenie.
Przykład:
db.pets.count({
"type": "Dog"
})
Wynik:
4
db.collection.count()
metoda nie zwraca dokumentu takiego jak count
robi polecenie. Po prostu zwraca liczbę.
countDocuments()
Metoda
db.collection.countDocuments()
metoda zwraca liczbę dokumentów pasujących do zapytania dla kolekcji lub widoku.
collection
część to nazwa kolekcji lub widoku do wykonania operacji liczenia.
Przykład:
db.pets.countDocuments({
"type": "Dog"
})
Wynik:
4
Zasadniczo ten sam wynik, co db.collection.count()
, chociaż zaleca się użycie countDocuments()
zamiast count()
jeśli to możliwe.
Dokumentacja MongoDB stwierdza:
Sterowniki MongoDB kompatybilne z funkcjami 4.0 wypierają ich odpowiedni kursor i kolekcję
count()
API na korzyść nowych API dlacountDocuments()
iestimatedDocumentCount()
. Aby uzyskać szczegółowe nazwy API dla danego sterownika, zapoznaj się z dokumentacją sterownika.
Ponadto, gdy jest używany bez predykatu zapytania, count()
opiera się na metadanych, co może skutkować przybliżoną liczbą. countDocuments()
z drugiej strony metoda nie opiera się na metadanych i zwraca dokładną liczbę, wykonując agregację dokumentów.
estimatedDocumentCount()
Metoda
db.collection.estimatedDocumentCount()
metoda jest opakowaniem dla count
polecenie, które zwraca liczbę wszystkich dokumentów w kolekcji lub widoku.
Przykład:
db.pets.estimatedDocumentCount()
Wynik:
7
db.collection.estimatedDocumentCount()
metoda nie przyjmuje filtra zapytań. Zamiast tego używa metadanych do zwrócenia liczby dokumentów dla całej kolekcji/widoku.
cursor.count()
Metoda
cursor.count()
metoda jest opakowaniem dla count
polecenie, które zlicza liczbę dokumentów, do których odwołuje się kursor.
W rzeczywistości nie wykonuje zapytania. Po prostu zlicza i zwraca liczbę wyników, które zostałyby zwrócone przez zapytanie.
Przykład:
db.pets.find({"type": "Dog"}).count()
Wynik:
4
Jest to odpowiednik db.collection.count()
przykład metody powyżej.
Jak zacytowałem powyżej, sterowniki MongoDB kompatybilne z funkcjami 4.0 przestarzały odpowiedni kursor i kolekcję count()
API na korzyść nowych API dla countDocuments()
i estimatedDocumentCount()
.
$count
Operator potoku agregacji
$count
Operator agregacji przekazuje dokument do następnego etapu w potoku agregacji, który zawiera liczbę dokumentów wprowadzonych do bieżącego etapu.
Przykład:
db.pets.aggregate([
{
$match: { type: "Dog" }
},
{
$count: "DogCount"
}
])
Wynik:
{ "DogCount" : 4 }
Oto kolejny przykład, który pokazuje, jak używać tego operatora do liczenia zgrupowanych wyników.
db.pets.aggregate([
{
$match: { weight: { $lt: 30 } }
},
{
$group: { _id: "$type", count: { $sum: 1 } }
},
{
$sort : { count : -1, _id: 1 }
}
])
Wynik:
{ "_id" : "Dog", "count" : 3 }
{ "_id" : "Cat", "count" : 2 }
{ "_id" : "Bat", "count" : 1 }
To konkretne zapytanie można wykonać z mniejszą ilością kodu, używając $sortByCount
operator potoku agregacji (poniżej).
$sortByCount
Operator potoku agregacji
$sortByCount
operator agregacji grupuje przychodzące dokumenty na podstawie wartości określonego wyrażenia, a następnie oblicza liczbę dokumentów w każdej odrębnej grupie.
Oto jak możemy użyć $sortByCount
aby osiągnąć ten sam wynik, co w poprzednim przykładzie:
db.pets.aggregate([
{
$match: { weight: { $lt: 30 } }
},
{
$sortByCount: "$type"
}
])
Wynik:
{ "_id" : "Dog", "count" : 3 } { "_id" : "Cat", "count" : 2 } { "_id" : "Bat", "count" : 1 }
Każda grupa jest wyprowadzana we własnym dokumencie, który składa się z dwóch pól:
_id
pole zawierające odrębną wartość grupowania icount
pole zawierające liczbę dokumentów należących do tej grupy.
Dokumenty są sortowane według count
w porządku malejącym.