在MongoDB 4.0之前,你可以使用以下方法来查询文档数量:
1. count
方法:
在MongoDB 4.0之前,count
是最常用的统计文档数量的方法。
它可以与查询条件一起使用,直接返回匹配条件的文档数量。
javascript
db.collection.count({ query });
注意: 在MongoDB 4.0之后,count
方法虽然仍然可用,但官方建议使用 countDocuments
来代替它,因为 count
的准确性在某些情况下可能会受到影响(例如集合存在分片时)。
2. estimatedDocumentCount
方法:
estimatedDocumentCount
返回集合中的文档数量的估计值,不适用于复杂的查询条件。
它更快,因为它是基于集合的元数据,而不是实际扫描文档。
javascript
db.collection.estimatedDocumentCount();
适用场景: 当你需要快速获取集合中大致的文档数量时,适用于大集合和不需要精确计数的情况。
3. countDocuments
方法(MongoDB 4.0及之后推荐):
在MongoDB 4.0及之后,countDocuments
是推荐使用的方式,因为它在查询复杂条件时更加准确。
与 count
方法相比,它会在评估查询时考虑集合的筛选器和索引。
javascript
db.collection.countDocuments({ query });
countDocuments
在内部类似于一个带有 aggregate
操作的查询。
具体来说,countDocuments
是通过构建一个带有 $match
阶段的聚合管道来实现的,这个 $match
阶段会使用传入的查询条件来筛选文档,然后再通过 $group
阶段进行计数。这种方式可以确保在使用复杂查询条件时,计数结果是准确的。
具体过程:
$match
阶段:应用你提供的查询条件,过滤出符合条件的文档。$group
阶段:对筛选出的文档进行分组和计数,最终返回符合条件的文档数量。
示例代码:
javascript
db.collection.aggregate([
{ $match: { /* your query conditions */ } },
{ $group: { _id: null, count: { $sum: 1 } } }
]);
为什么选择 countDocuments
:
- 准确性:
countDocuments
会考虑查询的过滤条件和索引,确保在有条件筛选时计数结果是准确的。 - 性能:尽管内部类似于
aggregate
,countDocuments
针对这种计数场景进行了优化,通常比手动构建的aggregate
更高效。
总结:
在MongoDB 4.0之前,你可以继续使用 count
方法来统计文档数量。
如果你在使用MongoDB 4.0或之后的版本,建议迁移到 countDocuments
,以确保查询的准确性和性能。
如果你仅需估算文档数量而不需要精确计数,estimatedDocumentCount
是更高效的选择。
在 MongoDB 3.6 单机 (未分片) 的实践经验
estimatedDocumentCount
速度最快, 不可靠, 不能使用查询条件
和实际文档数据不一致, 甚至有时候会出现文档数量是负数. 但是比率很低, 绝大多数情况还是准确的.
countDocuments
在低版本不支持 hint
虽然官方的文档中有显示支持 hint
, 但是实际上确不支持.
count
支持 hint
速度和 countDocuments
差不多, 但是支持 hint
结论
- 如果可以接受不是 100% 准确并且没有查询条件(查看整个集合的数量), 使用
estimatedDocumentCount
. - 如果有查询条件, 选择
count