2013-09-16 2 views
0

У меня есть составной индекс, который выглядит так: { _id: -1, votes: -1 } в моей коллекции articles, чтобы я мог сортировать документы, с помощью которых я могу иметь высоко проголосовавшие статьи сверху, а затем последние статьи после этого в порядке убывания.Пейджинг по коллекции, отсортированной по индексу соединения?

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

Например:

Articles.find().sort('-_id -votes').skip(20).limit(30)

Как MongoDB возвращаемые документы для этого запроса? Изменяет ли он курсор на основе порядка выполнения команд в драйвере или переупорядочивает их, чтобы предел происходил до сортировки или что-то другое, кроме того, как я думаю, что он будет выполняться?

+1

курсор находит и сортирует, а не на порядок команд, как и к решению проблемы: посмотрите здесь: http://stackoverflow.com/a/5526907/383478 – Sammaye

ответ

1

Похоже, что у вас неправильный индекс и сортировка. То, что я думаю, что вы хотите статьи отсортированы по голосам (по убыванию), затем _id (также нисходящие):

{votes: -1, _id: -1} 

Если вы как бы в этом случае вы будете получать статьи отсортированы по голосам (с самой первой), в порядке создания.

4

Во-первых, как отметил Тайлер, ваш индекс должен начинаться с «голосов: -1», если вы хотите сначала отсортировать по голосам.

Во-вторых, чтобы ответить на ваш основной вопрос: не имеет значения, какой порядок вы применяете для сортировки(), skip() и limit(), если вы применяете их перед извлечением результатов из курсора. Запрос, использующий их, всегда будет сортироваться первым, затем пропустить, а затем вернуть столько документов, сколько указано в лимите.

Так что запрос «Articles.find(). Sort ((голосов: -1)). Skip (20) .limit (10)« пропустит 20 наивысших проголосовавших статей и вернется после этого 10 после этого. Но, "Articles.find(). Sort ((голосов: -1}). Limit (10) .skip (20)" вернет то же самое! В вашем конкретном примере он пропустит 20, а затем вернет 30 документов после этого.

Для получения дополнительной информации, проверить документы: http://docs.mongodb.org/manual/core/read-operations/

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