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分钟后找不到光标