Docs 菜单
Docs 主页
/
MongoDB Manual
/ / /

cursor.count()

在此页面上

  • 定义
  • 兼容性
  • 行为
  • 示例
cursor.count()

重要

mongosh 方法

本页面提供 mongosh 方法的相关信息。这不是特定于语言的驱动程序(例如 Node.js)的文档。

如需了解 MongoDB API 驱动程序,请参阅特定语言的 MongoDB 驱动程序文档。

注意

与 4.0 功能兼容的 MongoDB 驱动程序弃用了各自的游标和集合 count() API,转而使用与 countDocuments()estimatedDocumentCount() 相对应的新 API。有关特定驱动程序的具体 API 名称,请参阅驱动程序 API 文档。

计算游标引用的文档数量。将 count() 方法附加到 find() 查询,以返回匹配文档的数量。该操作不执行查询,而是计算查询返回的结果。

count() 方法具有以下原型形式:

db.collection.find(<query>).count()

count() 方法具有以下参数:

Parameter
类型
说明
applySkipLimit
布尔

可选。 mongosh会忽略为此选项设立的任何值。 该值默认为true

该选项指定是否考虑cursor.skip()cursor.limit()方法在计数中的影响。 默认, count()方法会忽略cursor.skip()cursor.limit()的影响。 您必须设立applySkipLimit设置为true才能考虑这些方法的效果。

旧版mongo shell (现已弃用)使用了该选项的设置。

MongoDB 还提供了等效的 db.collection.count() 作为 db.collection.find(<query>).count() 构建的替代方案。

MongoDB 支持一起使用 hint()count()。有关示例,请参见指定要使用的索引

提示

另请参阅:

此方法可用于以下环境中托管的部署:

  • MongoDB Atlas:用于云中 MongoDB 部署的完全托管服务

注意

所有 MongoDB Atlas 集群都支持此命令。有关 Atlas 对所有命令的支持的信息,请参阅不支持的命令

当您在未指定查询谓词的 find() 操作上调用 count() 时,count() 方法可能会返回不准确的文档数。这些 count() 方法会根据集合的元数据返回结果,这可能会得出近似的计数。尤其,

对于基于集合元数据的计数,另请参阅带有计数选项的 CollStats 管道阶段

您无法在事务中使用 count 以及 Shell 助手 count()db.collection.count()

有关详情,请参阅事务和计数操作

在分片集群上,如果存在孤立文档或正在进行数据块迁移,则 find 中没有查询谓词的 count() 可能会导致计数不准确

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

您可以使用 $count 阶段来对文档进行计数。例如,以下操作会对集合中的文档进行计数:

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

$count 阶段相当于以下 $group + $project 序列:

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

提示

另请参阅:

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

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

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

以下是 count() 方法的示例。

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

db.orders.find().count()

以下操作计算 orders 集合中字段 ord_dt 大于 new Date('01/01/2012') 的文档的数量。

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

考虑到 limit(5) 的影响:以下操作计算 orders 集合中字段 ord_dt 大于 new Date('01/01/2012') 的文档数量:

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

以下操作使用名为 "status_1" 的索引(索引键规范为 { status: 1 })返回 orders集合字段 ord_dt 大于 new Date('01/01/2012')status 字段等于 "D" 的文档的计数:

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

后退

游标