2

私はこのようなモデリングを持っています

class Room
  include Mongoid::Document
  field :name, type: String
  has_many :messages
end

class Message
  include Mongoid::Document
  field :content, type: String
  belongs_to :room
end

過去 24 時間に最も多くのメッセージを受け取った上位 3 つのルームを見つける必要がありますが、どこから始めればよいかわかりません。
多分map/reduceで何か?

4

3 に答える 3

2

私はこれで解決しました

match = { "$match" => { "created_at" => { "$gte" => 1.day.ago } } }
group = { "$group" => { _id: '$room_id', count: {"$sum" => 1 } } }
sort = { "$sort" => { count: -1 } }
limit = { "$limit" => 3 }

Message.collection.aggregate([match, group, sort, limit])
于 2014-12-24T13:23:20.397 に答える
-1

これを行うためのより良い方法は間違いなくありますが、次のコードが機能するはずです。

Room.select("rooms.*, count(messages) as count").joins(:messages).where("messages.created_at < ?", 1.day.ago).group("rooms.id").order("count DESC").limit(3)
于 2014-12-23T14:01:25.893 に答える