2012-06-05 3 views
7

При выполнении запроса в MongoDb мне нужно получить общее количество всех совпадений вместе с самими документами как ограниченное/выгружаемое подмножество.mongodb получить счетчик без повторения поиска

Я могу достичь цели двумя запросами, но я не вижу, как это сделать с помощью одного запроса. Я надеюсь, что есть функция mongo, которая, в некотором смысле, эквивалентна SQL_CALC_FOUND_ROWS, так как кажется, что излишнему приходится выполнять запрос дважды. Любая помощь будет большой. Благодаря!

EDIT: Здесь приведен код Java, чтобы сделать это.

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

ответ

3

Я не уверен, какой язык вы используете, но обычно можно назвать count метод на курсоре, что это результат find запроса, а затем использовать тот же курсор, чтобы получить сами документы.

+0

спасибо за помощь, он работает как шарм. Я использую Java, и курсор имеет метод подсчета. – adamSpline

+7

Это не совсем правильно. Вопрос задает вопрос, как это сделать с помощью одного * запроса *. Использование 'cursor.count()' фактически просто делегирует второй запрос клиенту, но второй запрос все еще выполняется. – Raman

2

Это не только чрезмерное выполнение запроса дважды, но также существует риск несогласованности. Коллекция может измениться между двумя запросами или каждый запрос может быть перенаправлен на другой одноранговый узел в наборе реплик, который может иметь разные версии коллекции.

Функция count() на курсорах (в оболочке JavaScript MongoDB) действительно запускает другой запрос. Это можно увидеть, набрав «cursor.count» (без круглых скобок), поэтому это не лучше, чем запуск двух запросов.

В драйвере C++ курсоры даже не имеют функции «count». Существует «itcount», но он только перебирает курсор и извлекает все результаты, чего вы не хотите (по соображениям производительности). Драйвер Java также имеет «itcount», и там в документации говорится, что он должен использоваться только для тестирования.

Кажется, что невозможно «найти и получить общее количество» последовательно и эффективно.

Смежные вопросы