小编Chr*_*ton的帖子

并行运行 MongoDB 聚合

目前我正在对包含用户和事件信息的集合运行聚合。例如:

[
  {
    $match: {
      client: ObjectId('507f1f77bcf86cd799439011'),
      location: 'UK'
    }
  },
  {
    $group: {
      _id: null,
      count: {
        $sum: 1
      }
    }
  }
]
Run Code Online (Sandbox Code Playgroud)

以上是一个很大的简化,足以说明大约有 20 个不同的变量location可以进入该$match语句。这两者之间有时还有额外的步骤,这就是为什么我用它$group来计数。(而不是count

目前我在该client字段上有一个索引,但尚未在其他字段上创建索引(复合或其他)。由于有很多其他字段,我不能只为所有内容创建索引 - 这太昂贵了。

问题:当客户端的文档数量很少时,这很有效,但随着数量的增加,聚合必须扫描越来越多的文档。该指数将范围缩小,但这还不够。


主意

创建一个名为p(用于分区)的附加变量,并创建一个复合索引:{ client: 1, p: 1 }. p可以1- n

不要运行上面的管道,而是运行类似的管道n时间:(对于 的所有可能值p

[
  {
    $match: {
      client: ObjectId('507f1f77bcf86cd799439011'),
      p: 1, // or 2, 3, etc
      location: 'UK' …
Run Code Online (Sandbox Code Playgroud)

mongodb

5
推荐指数
1
解决办法
2536
查看次数

标签 统计

mongodb ×1