パフォーマンス上の理由から、ロードするフィールドを指定するためにmongoidクエリを書き込むときに、できるだけ頻繁にonly()
というキーワードを使用します。Mongoid:オブジェクトのいくつかのフィールドだけを読み込み、参照によって怠惰に読み込む方法はありますか?
普通の容疑者は、たとえば、すべての管理者のユーザーの電子メールを表示目的でのみ使用する場合です。
私が書くでしょう:私のユーザモデルが電子メールの束を一覧表示するとき、私は喜んで無視することができ、データの多くの非常に満ちているので、
User.where(:groups => :admins).only(:email).each do |u|
puts u.email
end
私はこれを行います。
しかし、今私のユーザーはProjectモデルで参照されているので、プロジェクトごとに私はできる:project.user
。 mongoidの怠惰な読み込みのおかげで、私の参照を呼び出すとき、私のオブジェクトのユーザーはインスタンス化される(そしてDBから照会される)。
しかし、たとえば、すべての管理プロジェクトのオーナーのメールをすべて一覧にしたい場合はどうすればよいですか?
私はこの記述します。ここでの大きな問題は、これをやって、私は各プロジェクトのための全体のユーザーオブジェクトをロードし、かなり重い得ることができるクエリに一致するプロジェクトがたくさんある場合ということです
Project.where(:admin_type => true).each do |p|
puts p.user.email
end
を。では、どのようにしてメールのみを読み込むのですか?
私はこれを行うことができます:p.user.only(:email).email
、私は次のことができます。私は私のような何かを書くことがしたい
p.user.email
:
User.where(:_id => p.user_id).only(:email).first.email
しかし、これは明らかに、単純にやっての素敵な構文の目的を敗北を't。何か案は ?
アレックスは
これはまだ実装されていますか?これにはGitHubの問題がありますか? –
これはpluckコマンドで追加されました。 User.all.pluck(:id)。 @ボスコビッチへの寄付はこちらhttp://stackoverflow.com/a/9991754/1050054 –