Как я могу сказать, есть ли больше результатов из запроса в MongoDB?
Вопрос
Есть ли предпочтительный способ запросить Mongo с ограничением и знать, будет ли будет больше результатов, если я запрошу следующую страницу с Skip/Limit?
То, что я делал, запрашивал еще один документ, чем мне нужно, отбросить его с конца и использовать существование этого дополнительного документа, чтобы узнать, даст ли другой запрос хотя бы еще один результат.
n = 10
docs = db.documents.find({'foo': 'bar'}).limit(n+1)
more = docs.count() > n
docs = docs[:n]
Я чувствую, что это общий вариант использования (зная, показывать ли кнопку «больше результатов» на веб -сайте), и я чувствую себя глупо с моим текущим решением.
Решение
MongoDB имеет хвостовые курсоры, что позволяет вам повторно использовать курсор после возврата всех данных. Это выглядело бы примерно так:
n = 10
docs = db.documents.find({"foo": "bar"}).limit(n)
more = docs.hasNext()
Обратите внимание, что получено только 10 документов, но курсор может быть проверен, чтобы определить, есть ли больше объектов. Единственная проблема заключается в том, что хвостовые курсоры могут использоваться только на ограниченных коллекциях.
Приведенное выше также можно использовать с обычным курсором, но вам придется запросить на n + 1
документы. Это в основном то же решение, что и вы сейчас. Вы должны использовать size()
хотя, поскольку это учитывает модификаторы Skip и Limit.
n = 10
docs = db.documents.find({"foo": "bar"}).limit(n + 1)
more = db.size() > n
Я не знаком с Pimongo, поэтому я не знаю это наверняка, но есть вероятность, что это решение посылает n + 1
Полные документы к вашему заявлению, а не требуются n
, в результате чего легкая пропускная способность. Если это так, вы можете создать функцию на стороне сервера, которая выполняет то же самое, но возвращает только объект, содержащий n
документы в массиве и флаг, который указывает, если n + 1
турнир Документ доступен.