Docs HomeMongoDB Manual

count

Definition定义

count

Counts the number of documents in a collection or a view. Returns a document that contains this count and as well as the command status.统计集合或视图中的文档数。返回包含此计数以及命令状态的文档。

Tip

In mongosh, this command can also be run through the count() helper method.mongosh中,这个命令也可以通过count()助手方法运行。

Helper methods are convenient for mongosh users, but they may not return the same level of information as database commands. In cases where the convenience is not needed or the additional return fields are required, use the database command.助手方法对mongosh用户来说很方便,但它们可能不会返回与数据库命令相同级别的信息。如果不需要方便,或者需要额外的返回字段,请使用数据库命令。

Note

MongoDB drivers compatible with the 4.0 features deprecate their respective cursor and collection count() APIs (which runs the count command) in favor of new APIs that corresponds to countDocuments() and estimatedDocumentCount(). 与4.0功能兼容的MongoDB驱动程序摒弃了各自的游标和集合count()API(运行count命令),转而使用与countDocuments()estimatedDocumentCount()相对应的新API。For the specific API names for a given driver, see the driver API documentation.有关给定驱动程序的特定API名称,请参阅驱动程序API文档。

Syntax语法

The command has the following syntax:该命令具有以下语法:

Note

Starting in version 4.2, MongoDB implements a stricter validation of the option names for the count command. The command now errors if you specify an unknown option name.从4.2版本开始,MongoDB对count命令的选项名称进行了更严格的验证。如果指定了未知的选项名称,该命令现在将出错。

db.runCommand(
{
count: <collection or view>,
query: <document>,
limit: <integer>,
skip: <integer>,
hint: <hint>,
readConcern: <document>,
maxTimeMS: <integer>,
collation: <document>,
comment: <any>
}
)

Command Fields命令字段

count has the following fields:具有以下字段:

Field字段Type类型Description描述
countstringThe name of the collection or view to count.要计数的集合或视图的名称。
querydocumentOptional.可选的。A query that selects which documents to count in the collection or view.选择要在集合或视图中计数的文档的查询。
limitintegerOptional.可选的。The maximum number of matching documents to return.要返回的匹配文档的最大数目。
skipintegerOptional.可选的。The number of matching documents to skip before returning results.返回结果之前要跳过的匹配文档数。
hintstring or documentOptional.可选的。The index to use. Specify either the index name as a string or the index specification document.要使用的索引。将索引名称指定为字符串或索引规范文档。
readConcerndocumentOptional.可选的。Specifies the read concern. 指定读取关注The option has the following syntax: 该选项具有以下语法:
readConcern: { level: <value> }
Possible read concern levels are: 可能的读取关注级别为:
  • "local". This is the default read concern level for read operations against the primary and secondaries.这是针对主和辅助的读取操作的默认读取关注级别。
  • "available". Available for read operations against the primary and secondaries. 可用于对主和辅助进行读取操作。"available" behaves the same as "local" against the primary and non-sharded secondaries. 对于primary和非分片的辅助,行为与"local"相同。The query returns the instance's most recent data.查询返回实例的最新数据。
  • "majority". Available for replica sets that use WiredTiger storage engine.适用于使用WiredTiger存储引擎的复制副本集。
  • "linearizable". Available for read operations on the primary only.仅可用于primary上的读取操作。
For more formation on the read concern levels, see Read Concern Levels. 有关读取关注级别的更多信息,请参阅读取关注级别
maxTimeMSnon-negative integerOptional.可选的。
Specifies a time limit in milliseconds. If you do not specify a value for maxTimeMS, operations will not time out. A value of 0 explicitly specifies the default unbounded behavior.指定以毫秒为单位的时间限制。如果不指定maxTimeMS的值,操作将不会超时。值0显式指定默认的无边界行为。
MongoDB terminates operations that exceed their allotted time limit using the same mechanism as db.killOp(). MongoDB only terminates an operation at one of its designated interrupt points. MongoDB使用与db.killOp()相同的机制终止超过指定时间限制的操作。MongoDB只在其指定的中断点之一终止操作。
collationdocumentOptional.可选的。
Specifies the collation to use for the operation.指定要用于操作的排序规则
collation allows users to specify language-specific rules for string comparison, such as rules for lettercase and accent marks.允许用户为字符串比较指定特定于语言的规则,例如字母大小写和重音标记的规则。
The collation option has the following syntax: collation选项具有以下语法:
collation: {
locale: <string>,
caseLevel: <boolean>,
caseFirst: <string>,
strength: <int>,
numericOrdering: <boolean>,
alternate: <string>,
maxVariable: <string>,
backwards: <boolean>
}
When specifying collation, the locale field is mandatory; all other collation fields are optional. 指定排序规则时,locale字段是必需的;所有其他排序规则字段都是可选的。For descriptions of the fields, see Collation Document.有关字段的说明,请参阅排序规则文档
If the collation is unspecified but the collection has a default collation (see db.createCollection()), the operation uses the collation specified for the collection.如果未指定排序规则,但集合具有默认排序规则(请参见db.createCollection()),则操作将使用为集合指定的排序规则。
If no collation is specified for the collection or for the operations, MongoDB uses the simple binary comparison used in prior versions for string comparisons.如果没有为集合或操作指定排序规则,MongoDB将使用以前版本中使用的简单二进制比较进行字符串比较。
You cannot specify multiple collations for an operation. For example, you cannot specify different collations per field, or if performing a find with a sort, you cannot use one collation for the find and another for the sort. 不能为一个操作指定多个排序规则。例如,不能为每个字段指定不同的排序规则,或者如果使用排序执行查找,则不能为查找使用一个排序规则,为排序使用另一个排序顺序。
commentanyOptional.可选的。
A user-provided comment to attach to this command. 要附加到此命令的用户提供的注释。Once set, this comment appears alongside records of this command in the following locations: 设置后,此注释将与此命令的记录一起显示在以下位置: A comment can be any valid BSON type (string, integer, object, array, etc). 注释可以是任何有效的BSON类型(字符串、整数、对象、数组等)。
New in version 4.4. 4.4版新增。

Stable API Support稳定的API支持

Starting in MongoDB 6.0, the count command is included in Stable API V1. To use the count command in the Stable API, you must connect your driver to a deployment that is running MongoDB 6.0 or greater.从MongoDB 6.0开始,count命令包含在Stable API V1中。要在Stable API中使用count命令,必须将驱动程序连接到运行MongoDB 6.0或更高版本的部署。

Behavior行为

Inaccurate Counts Without Query Predicate没有查询谓词的计数不准确

When you call count without a query predicate, you may receive inaccurate document counts. Without a query predicate, count commands return results based on the collection's metadata, which may result in an approximate count. In particular,如果在没有查询谓词的情况下调用count,则可能会收到不准确的文档计数。如果没有查询谓词,count命令将根据集合的元数据返回结果,这可能导致近似计数。具体来说,

For counts based on collection metadata, see also collStats pipeline stage with the count option.有关基于集合元数据的计数,请参阅带有count选项的collStats管道阶段

Count and Transactions计数和事务

When you use count in a transaction, the resulting count will not filter out any uncommitted multi-document transactions.在事务中使用count时,生成的计数不会筛选掉任何未提交的多文档事务

For details, see Transactions and Count Operations.有关详细信息,请参阅事务和计数操作

Accuracy and Sharded Clusters准确性和分片群集

On a sharded cluster, the count command when run without a query predicate can result in an inaccurate count if orphaned documents exist or if a chunk migration is in progress.在分片集群上,如果存在孤立文档或正在进行块迁移,则在没有查询谓词的情况下运行count命令可能会导致计数不准确

To avoid these situations, on a sharded cluster, use the db.collection.aggregate() method:为了避免这些情况,在分片集群上,使用db.collection.aggregate()方法:

You can use the $count stage to count the documents. For example, the following operation counts the documents in a collection:您可以使用$count阶段对文档进行计数。例如,以下操作对集合中的文档进行计数:

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

The $count stage is equivalent to the following $group + $project sequence:$count阶段相当于以下$group+$project序列:

db.collection.aggregate( [
{ $group: { _id: null, count: { $sum: 1 } } },
{ $project: { _id: 0 } }
] )
Tip

See also: 另请参阅:

$collStats to return an approximate count based on the collection's metadata.以返回基于集合元数据的近似计数。

Accuracy after Unexpected Shutdown意外停机后的准确性

After an unclean shutdown of a mongod using the Wired Tiger storage engine, count statistics reported by count may be inaccurate.在使用Wired Tiger存储引擎不干净地关闭mongod之后,count报告的计数统计数据可能不准确。

The amount of drift depends on the number of insert, update, or delete operations performed between the last checkpoint and the unclean shutdown. 漂移量取决于在最后一个检查点和非干净关闭之间执行的插入、更新或删除操作的数量。Checkpoints usually occur every 60 seconds. However, mongod instances running with non-default --syncdelay settings may have more or less frequent checkpoints.检查点通常每60秒出现一次。然而,使用非默认--syncdelay设置运行的mongod实例可能或多或少有频繁的检查点。

Run validate on each collection on the mongod to restore statistics after an unclean shutdown.mongod上的每个集合运行validate,以在非干净关闭后恢复统计信息

After an unclean shutdown:非干净关闭之后:

Note

This loss of accuracy only applies to count operations that do not include a query document.这种准确性损失仅适用于不包括查询文档的count操作。

Client Disconnection客户端断开连接

Starting in MongoDB 4.2, if the client that issued count disconnects before the operation completes, MongoDB marks count for termination using killOp.从MongoDB 4.2开始,如果在操作完成之前发出count的客户端断开连接,MongoDB会使用killOp标记count终止。

Examples实例

The following sections provide examples of the count command.以下部分提供了count命令的示例。

Count All Documents统计所有文档

The following operation counts the number of all documents in the orders collection:以下操作统计orders集合中所有文档的数量:

db.runCommand( { count: 'orders' } )

In the result, the n, which represents the count, is 26, and the command status ok is 1:结果,表示计数的n26,命令状态ok1

{ "n" : 26, "ok" : 1 }

Count Documents That Match a Query计数与查询匹配的文档

The following operation returns a count of the documents in the orders collection where the value of the ord_dt field is greater than Date('01/01/2012'):以下操作返回orders集合中ord_dt字段的值大于Date('01/01/2012')的文档数:

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

In the result, the n, which represents the count, is 13 and the command status ok is 1:结果,表示计数的n13,命令状态ok1

{ "n" : 13, "ok" : 1 }

Skip Documents in Count跳过计数中的文档

The following operation returns a count of the documents in the orders collection where the value of the ord_dt field is greater than Date('01/01/2012') and skip the first 10 matching documents:以下操作返回orders集合中ord_dt字段的值大于Date('01/01/2012')的文档的计数,并跳过前10个匹配的文档:

db.runCommand( { count:'orders',
query: { ord_dt: { $gt: new Date('01/01/2012') } },
skip: 10 } )

In the result, the n, which represents the count, is 3 and the command status ok is 1:结果,表示计数的n3,命令状态ok1

{ "n" : 3, "ok" : 1 }

Specify the Index to Use指定要使用的索引

The following operation uses the index { status: 1 } to return a count of the documents in the orders collection where the value of the ord_dt field is greater than Date('01/01/2012') and the status field is equal to "D":以下操作使用索引{ status: 1 }返回orders集合中ord_dt字段的值大于Date('01/01/2012')status字段等于"D"的文档的计数:

db.runCommand(
{
count:'orders',
query: {
ord_dt: { $gt: new Date('01/01/2012') },
status: "D"
},
hint: { status: 1 }
}
)

In the result, the n, which represents the count, is 1 and the command status ok is 1:结果,表示计数的n1,命令状态ok1

{ "n" : 1, "ok" : 1 }

Override Default Read Concern覆盖默认读取关注

To override the default read concern level of "local", use the readConcern option.要覆盖默认的读取关注级别"local",请使用readConcern选项。

The following operation on a replica set specifies a Read Concern of "majority" to read the most recent copy of the data confirmed as having been written to a majority of the nodes.以下对副本集的操作指定"majority"读取关注,以读取已确认写入大多数节点的数据的最新副本。

Important
  • To use the readConcern level of "majority", you must specify a nonempty query condition.若要使用"majority"readConcern级别,必须指定一个非空查询条件。
  • Regardless of the read concern level, the most recent data on a node may not reflect the most recent version of the data in the system.无论读取关注级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本。
db.runCommand(
{
count: "restaurants",
query: { rating: { $gte: 4 } },
readConcern: { level: "majority" }
}
)

To ensure that a single thread can read its own writes, use "majority" read concern and "majority" write concern against the primary of the replica set.要确保单个线程可以读取自己的写入,请对副本集的主线程使用"majority"读取关注和"majority"写入关注。