目前我正在对包含用户和事件信息的集合运行聚合。例如:
[
{
$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 ×1