2

2モデル:

Class User
 include Mongoid::Document
 has_many :reports
end

Class Report
 include Mongoid::Document
 belongs_to :user
end

すべてのユーザーに6つ以上のレポートを作成するには、次のようなクエリが必要です。

Users.where(reports.count > 5)

私はmongoid2.4.12を使用します

どうすればいいですか?

どうもありがとうございます!

4

3 に答える 3

1

OK、MongoDBには結合がないため、このクエリはできません。

この問題の修正は、カウンターキャッシュを使用することです。

最初のオプションは、カウンターキャッシュを次のようにすることです。

class User
  include Mongoid::Document
  field :reports_count, type: Integer
  has_many :reports
end

class Report
  include Mongoid::Document
  belongs_to :user
  after_create do |doc|
    doc.user.inc(:reports_count, 1)
  end
  after_destroy do |doc|
    doc.user.inc(:reports_count, -1)
  end
end

2番目のオプション(私はこのオプションを使用しました)は、このgemhttps ://github.com/jah2488/mongoid-magic-counter-cacheを使用することです。

この質問の場合:

モデル:

class User
 include Mongoid::Document
 field :report_count
 has_many :reports
end

Class Report
 include Mongoid::Document
 include Mongoid::MagicCounterCache
 belongs_to :user
 end

たとえば、ヘルパーの内部:

def users_with_reports_greather_than_5
 users_with_reports_greather_than_5 = []
 for u in User.where(report_count.ne => nil)
  if u.report_count > 5
   users_with_reports_greather_than_5 << u
  end
 end
 return users_with_reports_greather_than_5.count
end

よろしく!

于 2012-11-11T16:24:29.143 に答える
0

次を使用できます。

User.collection.find({"reports" => {"$size" => 5}}).count

5つのレポートを持つユーザーを取得するが、5つを超えるレポートを持つユーザーを取得するには、新しいレポートが追加されるたびに増加する追加のフィールド(reports_count)を保持する必要があります。ここに記載されているように、埋め込まれたドキュメントに条件を適用できます:(http://www.mongodb.org/display/DOCS/Advanced+Queries#AdvancedQueries-%24size

于 2012-11-07T12:48:02.190 に答える
0

5つを超えるレポートを取得したユーザーを見つけるには、mongodb集計フレームワークを使用する必要があります

モンゴシェルで

db.reports.aggregate(
                     // Group by user_id      
                     {$group:{_id:'$user_id',count:{$sum:1}, 

                      // Add the fields to result set along with grouped result
                      name:{$addToSet:'$any_field_you_need_to_return'}}}, 

                     // And return only the users who got greater than 5 reports
                     {$match:{count:{$gt:5}}}) 

アップデート

Aggregateでのみ導入されましたmoped v1.3。最新の原付をインストールして実行するには、gemfileに変更を加える必要がありますbundle install

  gem 'moped', :git=>'https://github.com/mongoid/moped.git', :branch => "master"

そして、あなたは次のような骨材を使うことができます

Reports.collection.aggregate(
                  {'$group' => {'_id' => '$user_id','count' => {'$sum' => 1},
                   'name' => {'$addToSet' => '$any_field_you_need_to_return'}}},
                  {'$match' => {'count' => {'$gt' => 5 }}})
于 2012-11-07T17:41:40.040 に答える