2012-03-13 9 views
2

最新のNレコードを一意の値(first_name)で取得しようとしました。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) 

は '制限' と 'DESC'

@users = User.limit(5) 
の両方を無視します

Works ..

私は間違って何をしていますか?
ご協力いただければ幸いです!

答えて

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

+0

毎回すべてのユーザーに対して繰り返し処理が行われます。 1000人のユーザーがいる場合は大したことはありませんが、1,000,000,000人がいる場合は、別のものを試してみるとよいでしょう。私がより良いアプローチを考えることができれば、私はコメントを投稿します。 – Kyle

+0

お時間をありがとう!私はgithubの既知の問題だと思う:https://github.com/mongoid/mongoid/issues/817 – Lamp

0

は、あなたがそのようなamatsuda /雷のようにページネーション宝石を使用してpage().per()を使用して結果を制限しようとしたことがありますか?

0

distinctcountの両方が、モンゴイドでlimitコマンドを無視します。 countを使用すると、true(つまりUser.limit(5).count(true))を渡して、スコープに注意を払うことができます。残念ながら、私が知っている限り、このようなトリックはありません(ドキュメント/ソースhereを参照)。

あなただけの最初の5 first_nameさんをつかむしたい場合は、この(区別できない)行うことができます。

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

をこれが(限度を尊重し、それでもデータベースから5つのフルオブジェクトをロードします残りのオブジェクトを破棄して完全な名前を付けます)。実際にdistinctを実行する必要がある場合は、集約フレームワークソリューションに向かう方がよいでしょう。

私がテストしていませんが、これはあなたが探しているもののようだ: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 

正しい結果が得られますが、カウントクエリで間違った結果が得られます。

関連する問題