db.collection.count()

在本页面

定义

  • db.collection. count(查询,选项)

    • 返回将_查询集合或视图的find()查询的文档计数。 db.collection.count()方法不执行find()操作,而是计算并返回匹配查询的结果数。

注意

与4.0功能兼容的MongoDB驱动程序弃用各自的游标和收集count()的API,取而代之的是新的API countDocuments()estimatedDocumentCount()。有关给定驱动程序的特定API名称,请参阅驱动程序文档。

重要

  • 避免使用

    db.collection.count()

    没有查询谓词的方法,因为如果没有查询谓词,该方法将基于集合的元数据返回结果,这可能会导致近似计数。特别是,

    • 在分片群集上,结果计数将无法正确过滤出孤立的文档。

    • 不正常关机后,计数可能不正确。

  • 有关基于集合元数据的计数,另请参阅 带有count选项的collStats管道阶段。

options文档包含以下字段:

count()等同于db.collection.find(query).count()

也可以看看

cursor.count()

行为

Sharded Clusters

在分片 cluster 上,如果孤儿文件存在或块迁移正在进行中,db.collection.count()可能导致计数不准确。

要避免这些情况,请在分片 cluster 上使用db.collection.aggregate()方法:

  • 您可以使用$count阶段来计算文档。对于 example,以下操作计算集合中的文档:

    db.collection.aggregate([
       { $count: "myCount" }
    ])
  • $count阶段等效于以下$group $project序列:

    db.collection.aggregate( [
       { $group: { _id: null, myCount: { $sum: 1 } } },
       { $project: { _id: 0 } }
    ] )
  • 要获取匹配查询条件的文档计数,还要包括$match阶段:

    db.collection.aggregate( [
       { $match: <query condition> },
       { $count: "myCount" }
    ] )

或者,如果使用$group + $project等效:

db.collection.aggregate( [
   { $match: <query condition> },
   { $count: "myCount" }
] )

也可以看看

$collStats返回基于集合的元数据的近似计数。

索引使用

考虑具有以下索引的集合:

{ a: 1, b: 1 }

执行计数时,如果出现以下情况,MongoDB 可以仅使用索引返回计数:

  • 查询可以使用索引,

  • 查询只包含索引键的条件,和

  • 查询谓词访问单个连续范围的索引键。

对于 example,以下操作可以仅使用索引_return 计数:

db.collection.find( { a: 5, b: 5 } ).count()
db.collection.find( { a: { $gt: 5 } } ).count()
db.collection.find( { a: 5, b: { $gt: 10 } } ).count()

但是,如果查询可以使用索引但查询谓词不访问单个连续范围的索引键,或者查询还包含索引外部字段的条件,那么除了使用索引之外,MongoDB 还必须读取文档要_return 计数。

db.collection.find( { a: 5, b: { $in: [ 1, 2, 3 ] } } ).count()
db.collection.find( { a: { $gt: 5 }, b: 5 } ).count()
db.collection.find( { a: 5, b: 5, c: 5 } ).count()

在这种情况下,在初始读取文档期间,MongoDB 将文档分页到 memory,以便后续 calls 相同的计数操作将具有更好的 performance。

意外关机后的准确性

使用有线老虎存储引擎不正常关闭mongod后,count()报告的计数统计信息可能不准确。

漂移量取决于在最后检查站和不干净关闭之间执行的 insert,update 或 delete 操作的数量。检查点通常每 60 秒发生一次。但是,使用 non-default --syncdelay设置运行mongod实例可能会有更多或更少的检查点。

在mongod上的每个集合上运行验证以在不正常关闭后恢复正确的统计信息。

注意

这种精度损失仅适用于不包含查询谓词的count()操作。

例子

计算集合中的所有文档

要计算orders集合中所有文档的数量,请使用以下操作:

db.orders.count()

此操作等效于以下内容:

db.orders.find().count()

计算匹配查询的所有文档

使用大于new Date('01/01/2012')的字段ord_dt计算orders集合中的文档数:

db.orders.count( { ord_dt: { $gt: new Date('01/01/2012') } } )

该查询等效于以下内容:

db.orders.find( { ord_dt: { $gt: new Date('01/01/2012') } } ).count()

译者:李冠飞

校对:

最后更新于