Docs 菜单

Docs 主页开发应用程序MongoDB Manual

cursor.count()

在此页面上

  • 定义
  • 行为
  • 举例
cursor.count()

重要

mongosh 方法

这是一个 mongosh方法。这不是Node.js或其他特定于编程语言的驱动程序方法的文档。

在大多数情况下, mongosh方法的工作方式与旧版mongo shell 方法相同。但是,某些旧方法在mongosh中不可用。

有关旧版mongo shell 文档,请参阅相应 MongoDB Server 版本的文档:

对于 MongoDB API 驱动程序,请参阅特定语言的MongoDB 驱动程序文档。

注意

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

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

重要

  • count()如果find() 操作在没有查询谓词的情况下运行,请避免使用 ,因为没有查询谓词,这些count() 会根据集合的元数据返回结果,这可能会得出近似计数。特别是,

    • 在分片集群上,所产生的计数将无法正确剔除孤立文档

    • 非正常关闭后,计数可能不正确。

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

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

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

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

范围
类型
说明
applySkipLimit
布尔
可选。指定是否考虑cursor.skip()cursor.limit()方法在计数中的影响。默认情况下, count()方法忽略cursor.skip()cursor.limit()的影响。将applySkipLimit设置为true以考虑这些方法的效果。

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

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

提示

另请参阅:

您不能在 事务countdb.collection.count() 中使用 以及count() Shell 助手 和 。

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

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

为避免这些情况,请在分片集群上使用 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()
← cursor.comment()

在此页面上