MongoDB - 聚合框架(总计数)

Ass*_*hko 13 mongodb mongodb-query

在MongoDB上运行正常的"查找"查询时,我可以通过在返回的游标上运行"count"来获得总结果计数(无论限制).因此,即使我将结果集限制为10(例如),我仍然可以知道结果总数为53(例如,再次).

如果我理解正确,聚合框架不会返回游标而只返回结果.因此,如果我使用$limit管道运营商,我怎么知道结果总数而不管上述限制?

我想我可以运行两次聚合(一次计算结果$group,一次$limit计算实际有限的结果),但这似乎效率低下.

另一种方法可以是$group$limit操作之前将结果总数附加到文档(via ),但这似乎也是低效的,因为这个数字将附加到每个文档(而不是仅为该集合返回一次).

我在这里错过了什么吗?有任何想法吗?谢谢!

例如,如果这是查询:

db.article.aggregate(
    { $group : {
        _id : "$author",
        posts : { $sum : 1 }
    }},
    { $sort : { posts: -1 } },
    { $limit : 5 }
);
Run Code Online (Sandbox Code Playgroud)

我怎么知道有多少结果可用(之前$limit)?结果不是游标,所以我不能只计算它.

Dyl*_*ong 2

Assaf,在不久的将来,聚合框架将会有一些增强,这可能会让您轻松地一次性完成计算,但现在,最好通过并行运行两个查询来执行计算:一个查询用于聚合顶级作者的#posts,以及用于计算所有作者的总帖子数的另一个聚合。另请注意,如果您需要做的只是对文档进行计数,那么使用 count 函数是执行计算的一种非常有效的方法。MongoDB 在 btree 索引中缓存计数,从而可以非常快速地对查询进行计数。

如果这些聚合结果很慢,有几种策略。首先,请记住,您希望以 $match 开始查询(如果适用)以减少结果集。$matches 也可以通过索引来加速。其次,您可以将这些计算作为预聚合来执行。不必在每次用户访问应用程序的某些部分时都运行这些聚合,而是让聚合在后台定期运行并将聚合存储在包含预聚合值的集合中。这样,您的页面就可以简单地从此集合中查询预先计算的值。

  • @Dylan 你知道这些改进是否已经完成了吗? (3认同)