Самый быстрый способ показать сначала документы с определенным свойством в MongoDB - PullRequest
0 голосов
/ 21 января 2012

У меня есть коллекции с огромным количеством документов, по которым мне нужно выполнять пользовательский поиск по различным запросам. Каждый документ имеет логическое свойство. Давайте назовем это "isInTop". Мне нужно показать документы, которые имеют это свойство первым во всех запросах. Да. Я могу легко сделать сортировку в этой области, как:

.sort( { isInTop: -1 } );

И создайте правильный индекс с полем "isInTop" в качестве последнего поля в нем. Но это будет работать медленно, так как индексы в монго лучше всего работают с уникальными полями . Так есть ли решение для отображения документов с полем "isInTop" в верхней части каждого запроса?

Я вижу два решения здесь. Во-первых: установите документы, которые должны быть в верхней части _id из "будущего". Как вы знаете, ObjectId содержит метку времени. Таким образом, я могу создать ObjectId с отметкой времени из будущего и использовать естественный порядок

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

Есть ли другие способы решения этой проблемы? Что будет работать лучше?

UPDATE Я сделал эту проблему с сортировкой по настраиваемому полю, которое представляет ранг.

1 Ответ

2 голосов
/ 22 января 2012

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

Лучше всего создать специальную коллекцию, в которой будут только те, о которых вы заботитесь.Это дает вам возможность логически (и в некоторой степени, физически) разделять документы.

В новой версии mongodb также есть поддержка «разреженного» индекса, который также может удовлетворить ваши потребности.Вы можете установить поле isInTop только в том случае, если вы хотите, чтобы оно было особенным, и затем создать разреженный индекс для него, который не будет иметь проблем, которые вы обычно имели бы с одним индексированным логическим полем (в btrees).

...