mongodb - 聚合游标计数

Posted

技术标签:

【中文标题】mongodb - 聚合游标计数【英文标题】:mongodb - aggregation cursor count 【发布时间】:2019-05-28 17:23:24 【问题描述】:

我正在阅读 API 文档(并进行了一些试验),但似乎 cursor.count() 不再存在,所以我想知道是否可以计算您的聚合计数。这是因为我想知道总共有多少个文档,同时仍然限制和跳过结果。我目前正在使用 $facet 来促进这一点,但不确定是否有更好的方法。


    $facet: 
    
        "results": 
        [
            
                "$skip": 
                    start
            ,
            
                "$limit": 
                    finish
            ,
        ],
        "total": 
        [
            
                "$count": 
                    "total" 
            ,
        ]
    

【问题讨论】:

明确一点:您想要整个集合的总计数,而不仅仅是跳过限制结果的计数(具有自然上限)? @BuzzMoschetti 我想要整个过滤聚合的计数以用于分页。 OK,所以$facet 之前可能有一个$match: expr。您的方法将正确生成过滤后的 agg 加上跳过限制子集的计数。 我只是想知道是否有内置的光标方式。只是对性能感到好奇。 无论是使用简单的.find() 查询和skip() and limit() 游标方法还是在上面的facet() 聚合中,都不会出现性能问题。可能$facet 会多花几毫秒,但时间可以忽略不计。 【参考方案1】:

在这个用例中使用$facet 很好,无论是风格还是性能。不过应该注意的是,这本质上是两个查询合二为一,尽管是在服务器端优化的。无论$skip/$limit 设置如何,获取过滤材料的全部计数(或者如果没有初始$match,则根本没有过滤器)需要时间。如果$match 产生的材料量相对较少,那么$count 会很快。所涉及的动态与常规 SQL 世界中的动态非常相似,例如 Run a query with a LIMIT/OFFSET and also get the total number of rows

【讨论】:

以上是关于mongodb - 聚合游标计数的主要内容,如果未能解决你的问题,请参考以下文章

Mongodb - 聚合和batchSize - 1分钟后找不到光标

使用聚合框架使用 MongoDB 进行组计数

MongoDB 聚合两个集合,返回附加字段作为计数

MongoDB(猫鼬)聚合计数集合中特定 ObjectID 的实例

MongoDB聚合组和计数字符串

在 Spring Boot Mongodb 中使用聚合框架按计数查找组