Нашел запись через ассоциацию
У меня есть такая модель
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
Мне нужно найти топ-3 комнаты, в которых было больше сообщений за последние 24 часа, но я не знаю, с чего начать.
может что то с картой / уменьшить?
3 ответа
Решение
Попробуйте это, используя агрегацию mongoid
Room.collection.aggregate(
{
"$match" => {"$messages.created_at" => {"$gte" => 1.day.ago}},
"$group" => {
_id: '$messages', count: {"$sum" => 1}
},
{ "$sort" => { count: -1 } }
}
)
Я решил с этим
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])
Определенно есть лучший способ сделать это, но я думаю, что этот код должен работать:
Room.select("rooms.*, count(messages) as count").joins(:messages).where("messages.created_at < ?", 1.day.ago).group("rooms.id").order("count DESC").limit(3)