db.collection.count()

在本页面

Definition

Parameter Type Description
query document 查询选择条件。
options document 可选的。用于修改计数的其他选项。

options文档包含以下字段:

Field Type Description
limit integer 可选的。要计算的最大文件数。
skip integer 可选的。计数前要跳过的文档数。
hint 字符串或文件 可选的。查询的索引名称提示或规范。


2.6 版中的新功能。
| maxTimeMS |整数|可选。 |允许查询运行的最长时间。
| readConcern | string |可选。指定read concern。默认级别为"local"
要使用read concern级别"majority",副本集必须使用WiredTiger 存储引擎和选举协议版本 1
从 MongoDB 3.6 开始,默认情况下启用对读取关注"majority"的支持。对于 MongoDB 3.6.1-3.6.x,您可以禁用阅读关注"majority"。有关更多信息,请参见禁用多数阅读关注
为确保单个线程可以读取其自己的写入,请对副本集的主数据库使用"majority"读取关注和"majority"写入关注。
要使用read concern级别"majority",您必须指定一个非空query条件。
版本 3.2 中的新功能。

count()等效于db.collection.find(query).count()构造。

See also

cursor.count()

Behavior

Sharded Clusters

在分片群集上,如果存在orphaned documents或正在进行chunk migration,则db.collection.count()可能会导致不准确的计数。

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

db.collection.aggregate([
   { $count: "myCount" }
])

$count阶段等效于以下$group $project序列:

db.collection.aggregate( [
   { $group: { _id: null, myCount: { $sum: 1 } } },
   { $project: { _id: 0 } }
] )
db.collection.aggregate( [
   { $match: <query condition> },
   { $count: "myCount" }
] )

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

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

See also

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

Index Use

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

{ a: 1, b: 1 }

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

例如,以下操作可以仅使用索引返回计数:

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 还必须读取文档返回计数。

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 会将文档分页到内存中,以便后续对相同计数操作的调用将具有更好的性能。

意外关机后的准确度

使用Wired Tiger存储引擎彻底关闭mongod后,count()报告的计数统计信息可能不准确。

漂移量取决于在最后一个checkpoint和不正常关机之间执行的插入,更新或删除操作的数量。检查点通常每 60 秒出现一次。但是,以非默认--syncdelay设置运行的mongod实例可能具有或多或少的频繁检查点。

在异常关闭后,对mongod上的每个集合运行validate以恢复正确的统计信息。

Note

这种准确性上的损失仅适用于不包含查询谓词的count()个操作。

Examples

计算集合中的所有文档

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

db.orders.count()

此操作等效于以下操作:

db.orders.find().count()

计算与查询匹配的所有文档

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

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

该查询等效于以下内容:

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