webentwicklung-frage-antwort-db.com.de

Unterschied zwischen count () und find (). Count () in MongoDB

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.

26
Abhiram mishra

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.

32
styvane

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()

16
sheilak

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).

4
makhdumi

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: 

  1. In einem Sharded-Cluster kann db.collection.count () ohne ein Abfrage-Prädikat zu einer ungenauen Anzahl führen, wenn verwaiste Dokumente vorhanden sind oder wenn eine Chunk-Migration ausgeführt wird.
  2. Nach einem unsauberen Herunterfahren eines Mongods unter Verwendung der Wired Tiger-Speicher-Engine können die von count () gemeldeten Zählstatistiken ungenau sein.
1
Amitesh

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.

0
Gil Beyruth