Мне интересно, как сортировка с индексом действительно работает в MongoDB. В документации MongoDB есть couplearticles, но они фактически не описывают, как происходит сортировка или временная сложность. Поиски SO и interweb в целом до сих пор не принесли ничего важного.Как сортировка с индексом работает в MongoDB?
Давайте предположим, что есть а документов в коллекции, находка() пункт соответствует б документов, есть предел с документов возвращаются, >>б >>с , и c - это некоторое количество, достаточно большое, чтобы возвращаемый набор не мог поместиться в память - скажем, 1M документов, например.
В начале операции, существуют б документы, которые должны быть отсортированы и отсортированный индекс дерева размера для функции документы будут отсортированы по.
Я могу себе представить:
A) траверс индекс для того, и для каждого ObjectId траверс список б документов. Возвратные совпадения до c. Это будет O (ab).
B) как A), но сначала создайте хэш-код идентификаторов объекта в b документов. Это O (a), но принимает O (b) память.
Я пытался рассмотреть виды, основанные на обходе набор б документов, но не могу придумать ничего быстрее, чем O (б журнала б), который не лучше, чем сортировка без индекса.
Я предполагаю (но, может быть, я ошибаюсь), что для каждого вида не требуется сканирование индекса, так как работает этот вид?
Update:
ответ Кевина и предоставил ссылку сужать вопрос много, но я хотел бы, чтобы подтвердить/уточнить несколько моментов:
- Как я понимаю, вы не можете используйте разные индексы для запроса и сортировки, если вы хотите избежать сортировки в памяти. Когда я прочитал this page, казалось, что вы можете (или, по крайней мере, не указывать, так или иначе), но это кажется неправильным. По сути, документы сортируются, потому что они просматриваются в порядке индекса во время запроса и поэтому возвращаются в порядке индекса. Правильно?
- При запросе на составной индекс индекс сортировки должен быть первым индексом в составном индексе, за исключением индексов, где запрос является равенством. Если нет, сортировка выполняется в памяти. Правильно?
Как работает сортировка с
$in
или$or
запросов?Например, предположим, что запрос{a: {$in: [4, 6, 2, 1, 3, 10]}, b: {$gt: 1, $lt: 6}}
... и есть составной индекс на a
и b
в таком порядке. Как сортировка будет работать в случаях сортировки на a
или b
? $or
еще сложнее, поскольку, как я понимаю, запросы $or
по существу разделены на несколько отдельных запросов. Есть $or
запросы всегда в памяти, по крайней мере, для слияния результатов отдельных запросов?
Это странно, все наши комментарии исчезли. В любом случае, $ in/$ или часть вопроса [здесь] (http://stackoverflow.com/questions/36490738/how-does-sorting-work-with-or-and-in-queries-in-mongodb). – elhefe
Получил, я отправлю ответ, как только смогу. –
У меня есть индексы в коллекции, на которой я пытаюсь выполнить сортировку, но когда я пишу запрос и проверяю результат объяснения(), я все равно получаю выигрышный счет как { \t \t «stage»: «SKIP», \t \t "skipAmount": 82560, \t \t "inputStage": { \t \t \t "этап": "СНП", \t \t \t "sortPattern": { \t \t \t \t "start_time": 1 \t \t \t}, \t \t \t "limitAmount": 82570, \t \t \t "inputStage": { \t \t \t \t "этап": "SORT_KEY_GENERATOR", \t \t \t \t "inputStage": { \t \t \t \t \t "stage": "COLLSCAN", \t \t \t \t \t "фильтр": { \t \t \t \t \t \t "ИД": { \t \t \t \t \t \t \t "$ экв": "someID" \t \t \t \t \t \t} \t \t \t \t \t }, \t \t \t \t \t "направление": "вперед" \t \t \t} \t \t \t} \t \t \t} \t \t} – AnoopGoudar