2012-06-05 6 views
7

Lors de l'exécution d'une requête dans MongoDb, j'ai besoin d'obtenir un décompte total de toutes les correspondances, ainsi que les documents eux-mêmes en tant que sous-ensemble limité/paginé.mongodb compte sans répétition find

Je peux atteindre l'objectif avec deux requêtes, mais je ne vois pas comment le faire avec une requête. J'espère qu'il existe une fonctionnalité mongo qui, dans un certain sens, équivaut à SQL_CALC_FOUND_ROWS, car il semble que vous ayez trop de mal à exécuter la requête deux fois. Toute aide est la bienvenue. Merci!

EDIT: Voici le code Java pour faire ce qui précède.

 DBCursor cursor = collection.find(searchQuery).limit(10); 
    System.out.println("total objects = " + cursor.count()); 

Répondre

3

Je ne suis pas sûr que la langue que vous utilisez, mais vous pouvez généralement appeler une méthode count sur le curseur qui est le résultat d'une requête find et ensuite utiliser ce même curseur pour obtenir eux-mêmes les documents.

+0

merci pour votre aide, cela fonctionne comme un charme. J'utilise Java et le curseur a une méthode de comptage. – adamSpline

+7

Ce n'est pas tout à fait correct. La question demande comment le faire avec une * requête *. L'utilisation de 'cursor.count()' délègue simplement la deuxième requête au pilote client, mais la deuxième requête est toujours exécutée. – Raman

2

Ce n'est pas seulement exagéré d'exécuter la requête deux fois, mais il y a aussi le risque d'incohérence. La collection peut changer entre les deux requêtes, ou chaque requête peut être routée vers un homologue différent dans un jeu de réplicas, qui peut avoir différentes versions de la collection. La fonction count() sur les curseurs (dans le shell JavaScript MongoDB) exécute vraiment une autre requête. Vous pouvez voir cela en tapant "cursor.count" (sans parenthèses), donc ce n'est pas mieux que d'exécuter deux requêtes.

Dans le pilote C++, les curseurs n'ont même pas de fonction "count". Il y a "itcount", mais il ne fait que boucler le curseur et récupérer tous les résultats, ce qui n'est pas ce que vous voulez (pour des raisons de performance). Le pilote Java a aussi "itcount", et la documentation dit qu'il devrait être utilisé uniquement pour les tests.

Il semble qu'il n'y ait aucun moyen de faire un "trouver et obtenir le nombre total" de manière cohérente et efficace.