web-dev-qa-db-fra.com

Différence entre count () et find (). Count () dans MongoDB

Quelle est la différence entre, je voulais fondamentalement trouver tous les documents dans le mycollection .db.mycollection.count() vs db.mycollection.find().count()

Ils retournent tous les deux le même résultat. Y a-t-il une raison pour laquelle quelqu'un choisirait la count() contre la find().count()? Contrairement au fait que find() applique une limite par défaut (corrigez-moi si je me trompe) pour lequel vous devez taper "it" afin d'en voir plus dans le shell.

26
Abhiram mishra

db.collection.count() et cursor.count() sont simplement des wrappers autour de la commande count , si bien que lancer db.collection.count() et cursor.count() avec/sans le même, renverra le même argument query, renverra le même résultat. Cependant, le résultat count peut être inexact dans un cluster partagé

Les pilotes MongoDB compatibles avec les fonctionnalités 4.0 rendent obsolètes leurs API de curseur et de collection respectives () en faveur de nouvelles API pour countDocuments () et estimationDocumentCount (). Pour l'API spécifique les noms d’un pilote donné, voir la documentation du pilote.

La méthode db.collection.countDocuments utilise en interne une requête d'agrégation pour renvoyer le nombre de documents alors que db.collection.estimatedDocumentCount/ renvoie le nombre de documents basé sur des métadonnées.

Il est à noter que la sortie estimatedDocumentCount peut être inexacte, comme indiqué dans la documentation .

32
styvane

Comme mentionné dans une autre réponse de Sheilak, les deux sont équivalents - à l'exception que db.collection.count() peut être inexact pour des grappes à éclat.

La dernière documentation dit:

count () est équivalent à db.collection.find (query) .count () construction.

Et alors,

Clusters fragmentés

Sur un cluster partagé, db.collection.count () peut générer un nombre inexact s'il existe des documents orphelins ou s'il s'agit d'une migration de bloc est en cours.

La documentation explique comment atténuer ce bug (utiliser un agrégat).

4
makhdumi

db.collection.count () est équivalent à la construction db.collection.find (query) .count ().

Exemples

Compter tous les documents d'une collection

db.orders.count()

Cette opération est équivalente à celle-ci:

db.orders.find().count()

Compter tous les documents correspondant à une requête

Comptez le nombre de documents dans la collection de commandes avec le champ ord_dt supérieur à la nouvelle date ('01/01/2012 '):

db.orders.count( { ord_dt: { $gt: new Date('01/01/2012') } } )

La requête est équivalente à la suivante:

db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).count()

Selon la documentation du scénario suivant, db.collection.count () peut être inexact: 

  1. Sur un cluster partagé, db.collection.count () sans prédicat de requête peut entraîner un nombre inexact si des documents orphelins existent ou si une migration de bloc est en cours.
  2. Après un arrêt impropre d'un mongod à l'aide du moteur de stockage Wired Tiger, les statistiques de comptage signalées par count () peuvent être inexactes.
1
Amitesh

Je crois que si vous utilisez une sorte de pagination comme:

find(query).limit().skip().count() 

Vous n'obtiendrez pas le même résultat que 

count(query)

Donc, dans de tels cas, si vous voulez obtenir le total, je pense que vous devrez peut-être utiliser les deux.

0
Gil Beyruth