搜尋

首頁  >  問答  >  主體

資料庫 - mongo使用$in查詢結果的排序問題。

最近的專案使用mongo作為資料庫,遇到了一個問題。

db.col_content.find({'nodeID':{$in:[d,c,b,a]}})

使用這樣的查詢的時候,查詢的結果是按照自然排序的,即:

{a.....},
{b.....},
{c.....},
{d.....},

不是在傳值的時候的{d,c,b,a};
我的猜測是,$in的操作是按照自然排序遍歷數據,依次跟$in裡面的數據進行比較,所以才會最終的資料依照自然排序,但是現在的業務需求需要依照傳值的順序,難道只能用程式碼層實作排序了嗎?
我用的是PHP,不知道有沒有比較簡單的方法可以進行排序。
請指教。


剛才看到另外一個類似的問題,如果有在nodeID上加索引的話,就會根據$in的傳值進行查詢。我去試試。


加了索引之後確實按照傳入順序進行排序了,但是樓下已經有人說了,這個是mongo的特性,不能作為依賴,現在只能透過程式碼層來實現了。

天蓬老师天蓬老师2789 天前749

全部回覆(1)我來回復

  • 巴扎黑

    巴扎黑2017-05-02 09:20:43

    我可以猜測為什麼會有這樣的結果:

    1. 如果沒有索引,那麼做COLLSCAN是按$natural順序遍歷的,所以出來的也是自然排序;

    2. 如果有索引,則會逐個key做IXSCAN,然後逐一放進結果集裡,也就是你要的順序。

    從程式設計的角度來講,這是有意義的。但是沒有任何保證將來的MongoDB版本也會一直保持這樣的行為。
    事實上大部分資料庫在不指定排序的時候都會以隨機順序,也就是引擎認為最有效率的順序傳回結果。所以即使現在最有效率的順序正好是你想要的順序,不代表將來一直都會這樣。不要依賴這個功能,否則將來在某個版本升級的時候會出現非常奇怪且難以定位的問題。
    個人建議:

    1. 如果可能,依照輸入的順序指定排序來得到正確的結果順序。

    2. 如果輸入的順序無法指定,在程式中自行排序。

    回覆
    0
  • 取消回覆