MongoDB count 性能

在MongoDB 4.0之前,你可以使用以下方法来查询文档数量:

1. count 方法:

在MongoDB 4.0之前,count 是最常用的统计文档数量的方法。

它可以与查询条件一起使用,直接返回匹配条件的文档数量。

db.collection.count({ query });

注意: 在MongoDB 4.0之后,count 方法虽然仍然可用,但官方建议使用 countDocuments 来代替它,因为 count 的准确性在某些情况下可能会受到影响(例如集合存在分片时)。

2. estimatedDocumentCount 方法:

estimatedDocumentCount 返回集合中的文档数量的估计值,不适用于复杂的查询条件。
它更快,因为它是基于集合的元数据,而不是实际扫描文档。

db.collection.estimatedDocumentCount();

适用场景: 当你需要快速获取集合中大致的文档数量时,适用于大集合和不需要精确计数的情况。

3. countDocuments 方法(MongoDB 4.0及之后推荐):

在MongoDB 4.0及之后,countDocuments 是推荐使用的方式,因为它在查询复杂条件时更加准确。

count 方法相比,它会在评估查询时考虑集合的筛选器和索引。

db.collection.countDocuments({ query });

countDocuments 在内部类似于一个带有 aggregate 操作的查询。

具体来说,countDocuments 是通过构建一个带有 $match 阶段的聚合管道来实现的,这个 $match 阶段会使用传入的查询条件来筛选文档,然后再通过 $group 阶段进行计数。这种方式可以确保在使用复杂查询条件时,计数结果是准确的。

具体过程:
  1. $match 阶段:应用你提供的查询条件,过滤出符合条件的文档。
  2. $group 阶段:对筛选出的文档进行分组和计数,最终返回符合条件的文档数量。
示例代码:
db.collection.aggregate([
  { $match: { /* your query conditions */ } },
  { $group: { _id: null, count: { $sum: 1 } } }
]);

为什么选择 countDocuments

  • 准确性:countDocuments 会考虑查询的过滤条件和索引,确保在有条件筛选时计数结果是准确的。
  • 性能:尽管内部类似于 aggregatecountDocuments 针对这种计数场景进行了优化,通常比手动构建的 aggregate 更高效。

总结:

在MongoDB 4.0之前,你可以继续使用 count 方法来统计文档数量。

如果你在使用MongoDB 4.0或之后的版本,建议迁移到 countDocuments,以确保查询的准确性和性能。

如果你仅需估算文档数量而不需要精确计数,estimatedDocumentCount 是更高效的选择。

在 MongoDB 3.6 单机 (未分片) 的实践经验

estimatedDocumentCount 速度最快, 不可靠, 不能使用查询条件

和实际文档数据不一致, 甚至有时候会出现文档数量是负数. 但是比率很低, 绝大多数情况还是准确的.

countDocuments 在低版本不支持 hint

虽然官方的文档中有显示支持 hint, 但是实际上确不支持.

count 支持 hint

速度和 countDocuments 差不多, 但是支持 hint

结论

  • 如果可以接受不是 100% 准确并且没有查询条件(查看整个集合的数量), 使用 estimatedDocumentCount.
  • 如果有查询条件, 选择 count
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值