Как я могу сказать, есть ли больше результатов из запроса в MongoDB?

StackOverflow https://stackoverflow.com/questions/3517825

  •  29-09-2019
  •  | 
  •  

Вопрос

Есть ли предпочтительный способ запросить 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турнир Документ доступен.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top