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管道阶段。

参数

类型

描述

query

document

查询选择标准。

options

document

可选的。修改计数的额外选项。

options文档包含以下字段:

领域

类型

描述

limit

integer

可选的。要计算的最大文档数。

skip

integer

可选的。计数前要跳过的文档数。

hint

string or document

可选的。查询的索引 name 提示或规范。 version 2.6 中的新内容。

maxTimeMS

integer

可选的。允许查询 run 的最大 time 时间。

readConcern

string

可选的。指定阅读关注。默认的 level 是“本地”。 要使用阅读关注的阅读关注 level,replica sets 必须使用WiredTiger 存储引擎并选举protocol version 1。 从 MongoDB 3.6 开始,默认情况下启用对读取关注“多数”的支持。对于 MongoDB 3.6.1 - 3.6.x,您可以禁用读取关注“多数”。有关更多信息,请参阅禁用阅读关注多数。 要确保单个线程可以读取自己的写入,请对副本集的主要使用“多数”读取关注和“多数”写入关注。 要使用“多数”的阅读关注 level,必须指定非空query条件。 version 中的新内容 3.2.

collation

document

可选的。 指定 用于操作的排序规则。 归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 排序规则选项具有以下语法: collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } 指定排序规则时,该locale字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见整理文档。 如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料db.createCollection()),则该操作将使用为集合指定的排序规则。 如果没有为集合或操作指定排序规则,则MongoDB会将以前版本中使用的简单二进制比较用于字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。 3.4版的新功能。

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()

译者:李冠飞

校对: