On this page
count
在本页面
Definition
count
- 计算集合或视图中的文档数。返回包含此计数以及命令状态的文档。
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()方法:
- 您可以使用$count阶段对文档进行计数。例如,以下操作对集合中的文档进行计数:
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> },
{ $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' } )
结果是,代表计数的n
为26
,命令状态ok
为1
:
{ "n" : 26, "ok" : 1 }
计数与查询匹配的文档
以下操作返回orders
集合中ord_dt
字段的值大于Date('01/01/2012')
的文档数:
db.runCommand( { count:'orders',
query: { ord_dt: { $gt: new Date('01/01/2012') } }
} )
结果是,代表计数的n
为13
,命令状态ok
为1
:
{ "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 } )
结果是,代表计数的n
为3
,命令状态ok
为1
:
{ "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 }
}
)
结果是,代表计数的n
为1
,命令状态ok
为1
:
{ "n" : 1, "ok" : 1 }
覆盖默认读取问题
要覆盖默认的阅读关注级别"local",请使用readConcern
选项。
对副本集的以下操作指定Read Concern到"majority"来读取已确认已写入大多数节点的数据的最新副本。
Important
- 要使用read concern级别"majority",副本集必须使用WiredTiger 存储引擎和选举协议版本 1。
从 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"写入关注。