最近的專案使用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的特性,不能作為依賴,現在只能透過程式碼層來實現了。
巴扎黑2017-05-02 09:20:43
我可以猜測為什麼會有這樣的結果:
如果沒有索引,那麼做COLLSCAN
是按$natural
順序遍歷的,所以出來的也是自然排序;
如果有索引,則會逐個key做IXSCAN
,然後逐一放進結果集裡,也就是你要的順序。
從程式設計的角度來講,這是有意義的。但是沒有任何保證將來的MongoDB版本也會一直保持這樣的行為。
事實上大部分資料庫在不指定排序的時候都會以隨機順序,也就是引擎認為最有效率的順序傳回結果。所以即使現在最有效率的順序正好是你想要的順序,不代表將來一直都會這樣。不要依賴這個功能,否則將來在某個版本升級的時候會出現非常奇怪且難以定位的問題。
個人建議:
如果可能,依照輸入的順序指定排序來得到正確的結果順序。
如果輸入的順序無法指定,在程式中自行排序。