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()。有关示例,请参见指定要使用的索引

提示

另请参阅:

当您在未指定查询谓词的 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()

后退

游标

在此页面上