Was ist der Unterschied zwischen, ich wollte eigentlich alle Dokumente in der mycollection .db.mycollection.count()
vs db.mycollection.find().count()
finden?
Beide liefern das gleiche Ergebnis. Gibt es einen Grund, warum jemand die count()
gegenüber der find().count()
wählen sollte? Im Gegensatz zu der Tatsache, dass find()
ein Standardlimit angewendet wurde (korrigieren Sie mich, wenn ich falsch liege), müssen Sie "it" eingeben, um mehr in der Shell anzuzeigen.
db.collection.count()
und cursor.count()
sind einfach Wrapper um den Befehl count
. Wenn also db.collection.count()
und cursor.count()
mit/ohne dasselbe ausgeführt werden, wird dasselbe query - Argument zurückgegeben. Das Ergebnis count
kann jedoch ungenau im Cluster mit Shards sein.
MongoDB-Treiber, die mit den 4.0-Funktionen kompatibel sind, lehnen ihre .__ ab. entsprechende Cursor- und Collection-Count () - APIs zugunsten neuer APIs für countDocuments () und geschätzteDocumentCount (). Für die spezifische API Namen für einen bestimmten Treiber finden Sie in der Treiberdokumentation.
Die Methode db.collection.countDocuments
verwendet intern eine Aggregationsabfrage , um die Dokumentanzahl zurückzugeben, während db.collection.estimatedDocumentCount/
die Dokumentanzahl basierend auf Metadaten zurückgibt.
Es ist erwähnenswert, dass die Ausgabe von estimatedDocumentCount
ungenau sein kann, wie in Dokumentation erwähnt.
db.collection.count()
ohne Parameter zählt alle Dokumente in einer Sammlung. db.collection.find()
ohne Parameter entspricht allen Dokumenten in einer Sammlung, und das Anhängen von count()
zählt sie, sodass es keinen Unterschied gibt.
Dies wird explizit in der Dokumentation db.collection.count () bestätigt :
Verwenden Sie die folgende Operation, um die Anzahl aller Dokumente in der Auftragserfassung zu ermitteln:
db.orders.count()
Diese Operation entspricht der folgenden:
db.orders.find().count()
Wie in einer anderen Antwort von Sheilak erwähnt, sind die beiden gleichwertig - mit der Ausnahme, dass db.collection.count()
für Cluster-Cluster ungenau sein kann.
Die neueste Dokumentation sagt:
count () entspricht dem Befehl db.collection.find (query) .count () konstruieren.
Und dann,
Sharded Cluster
In einem Cluster mit Shards kann db.collection.count () zu einer .__ führen. ungenaue Zählung, wenn verwaiste Dokumente vorhanden sind oder eine Chunk-Migration ist in Arbeit.
In der Dokumentation wird erläutert, wie dieser Fehler gemildert werden kann (Aggregat verwenden).
db.collection.count () entspricht dem Konstrukt db.collection.find (query) .count ().
Beispiele
Zähle alle Dokumente in einer Sammlung
db.orders.count()
Dieser Vorgang entspricht dem folgenden:
db.orders.find().count()
Zähle alle Dokumente, die einer Abfrage entsprechen
Zählen Sie die Anzahl der Dokumente in der Auftragssammlung, wobei das Feld ord_dt größer als das neue Datum ist ('01/01/2012 '):
db.orders.count( { ord_dt: { $gt: new Date('01/01/2012') } } )
Die Abfrage entspricht dem Folgenden:
db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).count()
Wie in der Dokumentation im folgenden Szenario angegeben, kann db.collection.count () ungenau sein:
Ich glaube, wenn Sie eine Art Paginierung verwenden, wie:
find(query).limit().skip().count()
Sie erhalten nicht dasselbe Ergebnis wie
count(query)
Wenn Sie also die Gesamtsumme erhalten möchten, müssen Sie wahrscheinlich beide verwenden.