在MongoDB中计算文档数量的最佳方法

4
我们有一个具有大量文档的集合,假设约有10万个。我们现在想统计具有键 x 的文档数量。
如果我使用 Collection.countDocuments({ x: { $exists: true }}) 进行尝试,可以得到结果,但它会立即在控制台中创建一个警告:Query Targeting: Scanned Objects / Returned has gone above 1000
因此,是否有更好的方法来统计文档数?字段上有一个 Index,是否有可能获取索引的长度?
谢谢

这回答您的问题吗?如何计算mongodb集合中文档的数量 - SuleymanSah
Collection.find({}).count() 看起来更快,但它已经被弃用了,所以很可能随时会被移除... - Skippy le Grand Gourou
1
@SkippyleGrandGourou 看看这个:https://stackoverflow.com/a/69168420/7399485 - Saulo M
3个回答

6

在Mongo中,没有真正查看索引树的方法,其他人提供的链接只返回树的大小,我不确定这个信息在这种情况下有多大用处。

现在回答你的问题,这是最好的计数方式吗? 答案是:是...有点。

countDocuments是一个包装函数,它仅模拟以下管道:

db.collection.aggregate([
   { $match: <query> },
   { $group: { _id: null, n: { $sum: 1 } } } )
])

这条流水线是最有效的方法,但运行此聚合与使用包装函数之间的差异约为100-200毫秒,这取决于您的机器规格。

也就是说,如果你想要更好的性能,你是找不到的。

话虽如此,这个警告是愚蠢的,它只是意味着您拥有超过1000个具有该字段的文档。它的真正目的是在您试图查询1-20个文档而没有正确的索引时警示您。


1

indexSize 键返回存储空间使用情况,而不是计数。

检查索引是否被使用。 (问题中还有更新)

可以使用提示选项在指定索引后检查性能。

如果可能的话,通过 $inc 运算符预先计算数量可能是一个好选择。

尝试使用 cursor.count 如果它更快,则 countDocument 应该更快,但检查没有坏处。 https://docs.mongodb.com/manual/reference/method/cursor.count/


1

这是索引中文档的数量还是索引存储大小?除非它是稀疏索引,否则索引还将包含缺少该字段的文档,对吧? - Thilo
这只是索引的大小,而不是长度或计数。 - Leon Braun

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接