Мне интересно, как сортировка с индексом действительно работает в MongoDB. В документации MongoDB есть пара , но они на самом деле не описывают, как происходит сортировка или временная сложность. Поиски SO и interweb в целом до сих пор не нашли ничего подходящего.
Предположим, что в коллекции есть документы, предложение find() соответствует b документам, есть ли предел c документов, возвращаемых, a → b → c, а c - некоторое количество, достаточно большое, такое, что возвращаемый набор не может поместиться в память - скажем, 1M документов, например.
В начале операции существует b документов, которые необходимо сортировать, и отсортированный индекс дерева размера a для функции, которую будут сортировать документы.
Я могу себе представить:
A) перемещайте индекс по порядку, и для каждого объекта ObjectID пересекается список из b документов. Возвращает совпадения до достижения c. Это будет O (ab).
B) как A), но сначала создайте хешсет ObjectID в b-документах. Это O (a), но принимает O (b) память.
Я попытался рассмотреть сортировки, основанные на обходе множества b-документов, но, похоже, не может найти ничего быстрее, чем O (b log b), что не лучше сортировки без индекса.
Я предполагаю (но, может быть, я ошибаюсь), что для каждого вида не требуется сканирование индекса, так как действительно этот вид действительно работает?
Update:
Ответ Кевина и предоставил ссылку сузить вопрос много, но я хотел бы подтвердить/уточнить несколько моментов:
- Как я понимаю, вы не можете использовать разные индексы для запроса и сортировки, если хотите избежать сортировки в памяти. Когда я читал эту страницу, он выглядел так, как если бы вы (или, по крайней мере, не указывали так или иначе), но это кажется быть неверным. По сути, документы сортируются, потому что они просматриваются в порядке индекса во время запроса и поэтому возвращаются в порядке индекса. Правильно?
- При запросе на составной индекс индекс сортировки должен быть первым индексом в составном индексе, за исключением индексов, где запрос равен равенству. Если нет, сортировка выполняется в памяти. Правильно?
-
Как сортировка работает с запросами
$in
или$or
? Например, предположим, что запрос{a: {$in: [4, 6, 2, 1, 3, 10]}, b: {$gt: 1, $lt: 6}}
... и там индекс соединения на a
и b
в этом порядке. Как сортировка будет работать в случаях, когда сортировка находится на a
или b
? $or
еще сложнее, поскольку, как я понимаю, запросы $or
по существу разделены на несколько отдельных запросов. Запросы $or
всегда относятся к памяти в памяти, по крайней мере для объединения результатов отдельных запросов?