在我的应用程序中,我们在会话分析中记录用户活动 收集,到目前为止,我们的收藏有大约30M的记录 主要是在2018年2月到2018年5月创建的20M。当我们计算活跃用户时 在给定的时间段,即2018年1月1日至2018年5月20日,服务器返回 超时错误,因为查询在60+秒内执行。我们的申请 在Rails中制作,我的查询是
> `SessionAnalytic.collection.aggregate([
{
"$match" => {
"start_date" => {
"$gte" => options[:start_date],
"$lte" => options[:end_date]
},
"community_uuid" => options[:community_uuid],
"user_type" => options[:user_type]
}
},
{"$group": {"_id": "$user_uuid" } },
{"$count": 'total_users' }
]).first`
在community_uuid,user_type和start_date字段上有索引。 任何人都可以建议为什么花费大量时间执行。 据我所知,MongoDB可以处理大量数据。
答案 0 :(得分:0)
我不是MongoDB专家,但我知道SQL索引是如何工作的,它应该非常相似。
在我看来,30M是大量的记录,但Mongo应该处理它 - 但它又取决于它。 最重要的问题是,您是否有包含3个字段或3个分隔索引的单个索引? - 你应该有一个包含3个字段(甚至4个)的索引。此索引还应包含$ user_uuid字段。为什么?因为它在group by子句中使用,所以如果$ user_uuid没有被索引,那么在匹配之后MongoDB需要从源集合中为每条记录获取$ user_uuid - 而且它会很慢。
如果它仍然不起作用,那么我会编写一些代码,每天汇总所有用户的所有活动,并更改您的查询以便使用预先分组的数据。