2016-09-18 2 views
-2

Из учебников там я знаю, что я могу сортировать коллекцию MongoDB в метеора по запросу, как это:Как сортировать коллекцию MongoDB в MeteorJS на постоянной основе?

// Sorted by createdAt descending 
Users.find({}, {sort: {createdAt: -1}}) 

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

Так что не лучше ли сортировать всю коллекцию раз и навсегда, а затем получить доступ к уже отсортированной коллекции с помощью Users.find()?

Вопрос: Как я могу сортировать всю коллекцию постоянно не только по найденным результатам?

+1

* «сортировать всю коллекцию» * в MongoDB не имеет смысла, который в соответствии с его документацией не гарантирует * любой порядок сортировки при поиске. – jonrsharpe

ответ

1

Это known limitation MiniMongo, на стороне клиента Meteor (подмножество) функций MongoDB.

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

Механизм, который используется для повышения эффективности поиска данных, является индексом . На сервере индексы используются, чтобы помочь сортировке, если это возможно:

В MongoDB операции сортировки могут получить порядок сортировки путем извлечения документов на основе заказа в индексе. Если планировщик запросов не может получить порядок сортировки из индекса, он будет сортировать результаты в памяти. Операции сортировки, которые используют индекс, часто имеют лучшую производительность, чем те, которые не используют индекс. Кроме того, операции сортировки, которые не используют индекс, будут прерваны при использовании 32 мегабайт памяти.

(Источник: MongoDB documentation)

В коллекции не имеет определенный порядок, к нему, объект, который содержит информацию о требованиях порядка в MongoDB является Cursor. Курсор можно извлекать несколько раз, и теоретически можно было бы превратить в эффективный упорядоченный сборщик данных.

К сожалению, на данный момент этого не происходит. То, как оно реализовано в настоящее время, MiniMongo не имеет индексов и не кэширует документы по заказу. Они переупорядочиваются каждый раз, когда курсор извлекается.

Сортировка достаточно эффективна (так как сортировка может быть эффективной, O(n*logn) вызовы функции сортировки), но для большого набора данных она может быть довольно длинной и ухудшать работу пользователя.

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

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