我有遗留代码从mongo(超过1000万个文档)中提取分析数据并构建报告。它工作得非常慢,因为当前代码大量使用聚合($ unwind,$ sum,$ group等)
以下是旧馆藏中的文档:
{
serverId: 'srv1',
dateVisited: '2014-12-24',
campaignId: 'c1',
...
landingpageClicks: [
{...},
{...}
],
offerTrackings: [
{
amount: 10
},
{
amount: 22
}
{
amount: 18
}
]
}
为了从这样的收集中获取统计数据,之前的程序员使用$ match,$ unwind,$ group和$ sum。我将这个集合mapreduced为新集合,现在看起来像这样:
{
_id: {
serverId: 'srv1',
dateVisited: '2014-12-24',
campaignId: 'c1'
},
value: {
landingpageClicksCount: 2,
offerTrackingsCount: 3,
offerTrackingsAmount: 50
}
}
结果,我的新系列变小了两倍,但是当我需要为特定日期(对于所有服务器和广告系列)提取统计数据时,我仍然需要使用聚合。 $ group不支持索引,因此查询仍然非常慢。
我已经设置了3个节点的分片(本地,两者都在同一台机器上),但现在查询速度慢了两倍! db.printShardingStatus()显示块在所有3个节点之间分布。但为什么现在变慢了呢?
P.S。我对分片设置很新,而且我不确定我的分片键是否合适:
{
'_id.serverId': 1,
'_id.dateVisited': 1,
'_id.campaignId': 1'
}
[已更新] 汇总以收集特定日期的统计信息(不包括多个参数):
db.clicks.aggregate([
{$match: {'_id.dateVisited': '2014-12-24'}},
{$group:{
_id: '$_id.dateVisited',
totalLandingpageClicksCount: {$sum: '$value.landingpageClicksCount'},
totalOfferTrackingsCount: {$sum: '$value.offerTrackingsCount'},
totalOfferTrackingsAmount: {$sum: '$value.offerTrackingsAmount'}
}}
])
用户也可以通过多个字段请求灌浆,例如group by date,然后是serverId,然后是campaignId,report应该如下所示:
2014-12-24 | 50 lp clicks | 21 offer clicks | $600 // srv1 + srv2
srv1 | 20 lp clicks | 11 offer clicks | $400 // campaign1 + campaign2
campaign1 | 10 lp clicks | 6 offer clicks | $100
campaign2 | 10 lp clicks | 5 offer clicks | $300
srv2 | 30 lp clicks | 10 offer clicks | $200 // campaign3 + campaign4
campaign3 | 20 lp clicks | 4 offer clicks | $100
campaign4 | 10 lp clicks | 6 offer clicks | $100