我需要做一些"高级搜索" 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。
我只是想知道是否有更好的方法可以解决这个性能问题?
答案 0 :(得分:1)
您可以预先计算过去几个赛季的数据并进行两步查询:
a)获取过去的数据 b)获取当前数据
您可以尝试优化该查询的索引
硬件:使用SSD
硬件:更多内存
引入分片以分割负载