根据聚合结果

时间:2016-05-05 14:36:54

标签: mongodb aggregation-framework

我需要做一些"高级搜索" MongoDB的功能。这是一个运动系统,每个赛季都会收集球员统计数据,如下所示:

{
  player: {
    id: int,
    name: string
  },
  goals: int,
  season: int
}

使用可以跨季节搜索数据,例如:我想搜索得分>的玩家2012赛季至2016年的30个进球。

我可以使用mongodb聚合:

db.stats.aggregate( [
 { $match: { season: { $gte: 2014, $lte: 2016 } } }
 { $group: { _id: "$player", totalGoals: { $sum: "$goals" } } },
 { $match: { $totalGoals: { $gte: 30 } } },
 { $limit: 10 },
 { $skip: 0 }
] )

工作正常,速度可以接受超过300万条记录的收藏。

但是,如果用户只想搜索更大的季节范围,请说:玩家生命周期统计。聚合结果非常非常缓慢。我知道MongoDB必须通过所有文档并计算$ totalGoals。

我只是想知道是否有更好的方法可以解决这个性能问题?

1 个答案:

答案 0 :(得分:1)

  1. 您可以预先计算过去几个赛季的数据并进行两步查询:

    a)获取过去的数据 b)获取当前数据

  2. 您可以尝试优化该查询的索引

  3. 硬件:使用SSD

  4. 硬件:更多内存

  5. 引入分片以分割负载