真的沒有什麼比告訴問題更多了。有沒有辦法在使用mongodb/mongoid進行排序時將所有nil值放在最後?
使用mongoid:
People.asc(:age)
我先得到零值。
有沒有辦法總是返回零最近,或告訴mongodb將零視爲非常高?
酷似什麼回答了the same problem in sql here
真的沒有什麼比告訴問題更多了。有沒有辦法在使用mongodb/mongoid進行排序時將所有nil值放在最後?
使用mongoid:
People.asc(:age)
我先得到零值。
有沒有辦法總是返回零最近,或告訴mongodb將零視爲非常高?
酷似什麼回答了the same problem in sql here
我很確定MongoDB的答案是「否」。沒有辦法提供自定義分類功能,只能提供按鍵進行排序。有a request for custom sorting functions,他們甚至提到你的特定用例:
JavaScript的排序幫手自定義排序/索引
[...]
難道這是用來按字母順序排序上的一個字段,並把在結果集的末尾有空值的文檔?
[...]
@nick - 是
所以,你不是一個人在想要把null
s的一端或其他。
我認爲你現在所能做的最好是做在Ruby中,這樣的事情:
nils, not_nils = People.asc(:age).partition { |p| p.age.nil? }
people = not_nils + nils
我不使用Mongoid但據推測asc
爲您提供了一個可枚舉,如果不是那麼也許你可以堅持一個to_a
在那裏。當然,如果你正在分頁,這種駭客毫無用處。
如果你不希望升序爲非零年齡。如果這不重要,你可以看看是否
People.desc(:age)
會把零值放在最後。或者,你可以嘗試添加一個搜索參數不返回零值:
People.not_in(age: [nil]).asc(:age)
感謝您提供所需功能的鏈接。我會遵循這一點。 Mongoid使用標準,所以我需要一個to_a。但我認爲我們畢竟可以沒有零。正如你所說,分頁將使這個重要性不那麼重要。 – 2012-02-08 23:05:47
仔細看後,有什麼建議有基於函數的javascript排序。這意味着要對查詢的集合進行排序,mongodb必須迭代整個集合,這當然不能解決問題。 我希望mongodb擁有的東西簡單得多:null最後一次,或者先null。 – 2012-02-14 08:27:08
@Stephane:無論如何,排序要求數據庫遍歷整個結果集,問題是MongoDB只允許使用'a> b'或'a 2012-02-14 17:38:54