Performance 分片环境中的Mongodb聚合性能问题

Performance 分片环境中的Mongodb聚合性能问题,performance,mongodb,sharding,Performance,Mongodb,Sharding,我有从mongo(超过1000万个文档)提取分析数据并生成报告的遗留代码。它的工作速度非常慢,因为当前代码大量使用聚合($unwind、$sum、$group等) 以下是旧集合中的文档的外观: { serverId: 'srv1', dateVisited: '2014-12-24', campaignId: 'c1', ... landingpageClicks: [ {...}, {...} ], offerTrackings: [ {

我有从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。我将此集合映射为新集合,现在看起来如下所示:

{
  _id: {
      serverId: 'srv1',
      dateVisited: '2014-12-24',
      campaignId: 'c1'
  },
  value: {
    landingpageClicksCount: 2,
    offerTrackingsCount: 3,
    offerTrackingsAmount: 50
  }
}
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
结果,我的新集合缩小了两倍,但当我需要获取特定日期(所有服务器和活动)的统计数据时,我仍然必须使用聚合$组不支持索引,所以查询速度仍然非常慢

我已经设置了3个节点的切分(本地,两个节点都在同一台机器上),但是现在查询速度慢了两倍! printShardingStatus()显示块分布在所有3个节点之间。但为什么它现在变得慢得多呢

另外,我对切分设置非常陌生,我不确定我的切分键是否正确:

{
  '_id.serverId': 1,
  '_id.dateVisited': 1,
  '_id.campaignId': 1'
}
[更新]聚合以收集特定日期的统计数据(不通过多个参数分组):

用户还可以按多个字段请求分组,例如组、日期、服务器ID、活动ID和报告应如下所示:

{
  _id: {
      serverId: 'srv1',
      dateVisited: '2014-12-24',
      campaignId: 'c1'
  },
  value: {
    landingpageClicksCount: 2,
    offerTrackingsCount: 3,
    offerTrackingsAmount: 50
  }
}
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

你为什么要设置sharding?纯粹为了加速聚合?我们能看到聚合吗?我用聚合查询示例和所需输出示例更新了我的帖子。是的,我需要加快聚合速度。find()可以很好地处理索引,但聚合仍然是有效的slow@wdberkeley,分片是否有助于加速聚合?您是否有关于
\u id.datevisted
的索引?此外,如果是日期,则最好将其存储为日期类型。切分可以改进聚合的某些部分,例如在某些条件下的
$match
阶段,但它对
$group
阶段没有真正的帮助。这不是切分的好理由。是的,我已经在
\u id.datevisted
上创建了索引
db.clicks.find({u id.datevisted':'XXX-XX-XX')
足够快,但聚合速度非常慢。我不知道如何加快速度。