2012-03-13 80 views
2

我試圖用唯一值(first_name)獲取最新的N條記錄。Mongoid極限參數被忽略

到目前爲止:

@users = User.all(:limit => 5, :sort => [:created_at, :desc]).distinct(:first_name) 

幾乎works..But忽略限制和排序順序
另外:

@users = User.limit(5).desc(:created_at).distinct(:first_name) 

忽略兩個 '限制' 和 '降序'

@users = User.limit(5) 

工程..

我在做什麼錯?
任何幫助將不勝感激!

回答

1

我玩了一會兒,這是我能想到的最好的。

祝你好運。

@users = User.desc(:created_at).reduce([]) do |arr, user| 
    unless arr.length == 5 || arr.detect{ |u| u.first_name == user.first_name } 
    arr << user 
    end 
    arr 
end 
+0

不錯的選擇。有用!它會影響性能嗎? – Lamp 2012-03-13 19:42:36

+0

它將每次迭代所有用戶。如果你有1000個用戶,沒有什麼大不了的,但如果你有1,000,000,000個用戶,那麼你可能想嘗試其他的東西。如果我能想到更好的方法,我會發表評論。 – Kyle 2012-03-13 19:45:33

+0

感謝您的時間!我認爲這是github上的一個已知問題:https://github.com/mongoid/mongoid/issues/817 – Lamp 2012-03-13 19:58:18

0

您是否嘗試過使用分頁寶石如amatsuda /雷和使用page().per()限制的結果?

0

distinctcount都忽略了Mongoid中的limit命令。通過count,您可以傳遞true(即User.limit(5).count(true))來強制它注意範圍。不幸的是,就我所知,不存在這樣的訣竅(參見文檔/來源here)。

如果你只想搶前5 first_name的,你可以做到這一點(不顯着):

User.desc(:created_at).limit(5).map(&:first_name)

這將尊重限制,但仍然從數據庫中加載5個完整的對象(然後丟棄剩下的對象給你全名)。如果你真的需要獨立運行,你最好走向一個聚合框架解決方案。

我沒有測試過,但是這似乎是你在找什麼:https://stackoverflow.com/a/17568267/127311

0

我打了一些成績,我發現這一點。

User.limit(2).count => 10 #but in array I found only two results 
User.limit(2).to_a.count => 2 

可能會限制給出正確的結果,但計數查詢會給出錯誤的結果。