count

在本页面

Definition

count的格式如下:

{
  count: <collection or view>,
  query: <document>,
  limit: <integer>,
  skip: <integer>,
  hint: <hint>,
  readConcern: <document>
}

count具有以下字段:

Field Type Description
count string 要计数的集合或视图的名称。
query document 可选的。一个查询,用于选择要在集合或视图中计数的文档。
limit integer 可选的。要返回的匹配文档的最大数量。
skip integer 可选的。返回结果前要跳过的匹配文档数。
hint 字符串或文件 可选的。要使用的索引。将索引名称指定为字符串或索引规范文档。


2.6 版中的新功能。
| readConcern |文档|可选。指定read concern。该选项具有以下语法:
readConcern: { level: <value> }
可能的阅读关注级别为:
"local"。这是默认的阅读关注级别。
"available"。当未指定读取操作和因果一致的会话和“ level”时,这是针对次要对象的读取的默认值。查询返回实例的最新数据。
"majority"。可用于使用WiredTiger 存储引擎的副本集。
"linearizable"。仅可用于primary上的读取操作。
有关阅读关注级别的更多信息,请参阅阅读关注级别
对于"local"(默认)或"majority"读关注级别,您可以指定afterClusterTime选项以使读操作返回满足级别要求和在群集时间之后指定的数据。有关更多信息,请参见读取操作和因果一致的会话

MongoDB 在mongo shell 中还提供了count()db.collection.count()包装器方法。

Behavior

在分片群集上,如果存在orphaned documents或正在进行chunk migration,则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返回基于集合元数据的近似计数。

意外关机后的准确度

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

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

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

Note

这种准确性损失仅适用于不包含查询文档的count个操作。

Examples

以下各节提供了count命令的示例。

计算所有文件

以下操作计算orders集合中所有文档的数量:

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

结果是,代表计数的n26,命令状态ok1

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

计数与查询匹配的文档

以下操作返回orders集合中ord_dt字段的值大于Date('01/01/2012')的文档数:

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

结果是,代表计数的n13,命令状态ok1

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

跳过文件计数

以下操作返回orders集合中的文档计数,其中ord_dt字段的值大于Date('01/01/2012'),并跳过前10个匹配的文档:

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

结果是,代表计数的n3,命令状态ok1

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

指定要使用的索引

以下操作使用索引{ 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 }
   }
)

结果是,代表计数的n1,命令状态ok1

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

覆盖默认读取问题

要覆盖默认的阅读关注级别"local",请使用readConcern选项。

对副本集的以下操作指定Read Concern"majority"来读取已确认已写入大多数节点的数据的最新副本。

Important

从 MongoDB 3.6 开始,默认情况下启用对读取关注"majority"的支持。对于 MongoDB 3.6.1-3.6.x,您可以禁用阅读关注"majority"。有关更多信息,请参见禁用多数阅读关注

  • 要使用readConcern级别"majority",必须指定非空query条件。

  • 无论read concern级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本。

db.runCommand(
   {
     count: "restaurants",
     query: { rating: { $gte: 4 } },
     readConcern: { level: "majority" }
   }
)

为确保单个线程可以读取其自己的写入,请对副本集的主数据库使用"majority"读取关注和"majority"写入关注。

首页