Как я могу узнать, есть ли еще результаты по запросу в MongoDB? - PullRequest
2 голосов
/ 19 августа 2010

Есть ли предпочтительный способ запрашивать монго с лимитом и знать, будет ли больше результатов, если я сделаю запрос на следующей странице с пропуском / лимитом?

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

n = 10
docs = db.documents.find({'foo': 'bar'}).limit(n+1)
more = docs.count() > n
docs = docs[:n]

Я чувствую, что это распространенный случай использования (зная, показывать или нет кнопку "больше результатов" на веб-сайте), и я чувствую себя глупо с моим текущим решением.

1 Ответ

3 голосов
/ 19 августа 2010

MongoDB имеет настраиваемые курсоры , которые позволяют повторно использовать курсор после того, как все данные возвращены. Это будет выглядеть примерно так:

n = 10
docs = db.documents.find({"foo": "bar"}).limit(n)
more = docs.hasNext()

Обратите внимание, что получено только 10 документов, но курсор можно осмотреть, чтобы определить, есть ли еще доступные объекты. Единственная проблема заключается в том, что настраиваемые курсоры могут использоваться только в ограниченных коллекциях.

Выше также можно использовать с обычным курсором, но вам придется запросить n + 1 документов. Это в основном то же решение, которое вы используете сейчас. Вы должны использовать size(), так как это учитывает модификаторы пропуска и ограничения.

n = 10
docs = db.documents.find({"foo": "bar"}).limit(n + 1)
more = db.size() > n

Я не знаком с PyMongo, поэтому точно не знаю, но есть вероятность, что это решение отправляет n + 1 полные документы в ваше приложение, а не требуемый n, что приводит к незначительной пропускной способности накладные расходы. В этом случае вы можете создать серверную функцию, которая делает то же самое, но возвращает только объект, содержащий n документы в массиве, и флаг, указывающий, является ли n + 1 th * 1018. * документ доступен.

...