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()
一起使用。有关示例,请参阅指定要使用的索引。提示
另请参阅:
行为
计数和事务
您不能在 事务count
db.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()