我想知道如何使用索引進行排序實際上在MongoDB中有效。 MongoDB文檔中有一個couplearticles,但它們實際上沒有描述排序過程或時間複雜度。一般來說,搜索SO和互聯網並沒有涉及任何相關內容。如何在MongoDB中使用索引進行排序?
假設有集合中的一個文件,查找()子句b文件相匹配,還有的Ç文件限制返回,一個 >>b >>Ç ,並且c是一些適當的大數字,例如返回的集合不能適應內存 - 比方說1M文檔。
在操作的開始,存在b文件需要進行排序和大小一個爲特徵的文件將被排序的排序樹索引。
我可以想像:
A),以便遍歷索引,並且對於每個遍歷的ObjectID的b文檔列表。返回匹配,直到達到c。這將是O(ab)。 B)作爲A),但首先在文檔中建立對象ID的哈希集合。這是O(a),但需要O(b)內存。
我試着考慮基於遍歷集合b文件排序,但似乎無法拿出任何東西爲O快(b日誌b),這是不優於無索引排序。
我認爲(但也許我錯了),每種不需要索引掃描,那麼排序如何實際工作?
更新:
凱文的答案,並提供鏈接縮小的問題很多,但我想確認/澄清幾點:
- 據我所知,你不能如果您想避免內存排序,請爲查詢和排序使用不同的索引。當我讀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
明白了,我會盡快發佈答案。 –
我有我試圖進行排序的集合上的索引,但是當我編寫一個查詢並檢查explain()的結果時,我仍然獲得了贏得計劃 { | \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 「ID」:{ \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