count

定义

此页面记录了mongoshell方法,并且 没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的 MongoDB驱动程序文档。

注意

与4.0功能兼容的MongoDB驱动程序弃用各自的光标和收集count()的API,取而代之的是新的API countDocuments()和estimatedDocumentCount()。

返回与find()集合或视图查询匹配的文档数 。该 db.collection.count()方法不执行 find()操作,而是计算并返回与查询匹配的结果数。

重要

  • 避免使用db.collection.count()没有查询谓词的方法,因为如果没有查询谓词,该方法将基于集合的元数据返回结果,这可能会导致近似计数。特别是,
    • 在分片群集上,结果计数将无法正确过滤出孤立文档(在分片集群中,孤立文档是分片上的那些文档,由于迁移失败或由于异常关闭而导致的迁移清除不完全,这些文档也以其他分片的形式存在。)。
    • 不正常关机后,计数可能不正确。
  • 有关基于集合元数据的计数,另请参阅 带有count 选项的collStats管道阶段。
参数 类型 描述
query 文献 查询选择条件。
options 文献 可选的。用于修改计数的其他选项。

该options文档包含以下字段:

领域 类型 描述
limit 整数 可选的。要计算的最大文件数。
skip 整数 可选的。计数前要跳过的文档数。
hint 字符串或文件 可选的。索引名称提示或查询规范。
maxTimeMS 整数 可选的。允许查询运行的最长时间。
readConcern 可选的。指定读取关注。默认级别为 “local”。若要使用关注级别"majority",副本集必须使用WiredTiger存储引擎。您可以"majority"为具有三名成员的主次仲裁器(PSA)架构的部署禁用读取关注。但是,这对变更流(仅在MongoDB 4.0和更早版本中)和分片群集上的事务有影响。有关更多信息,请参见禁用多数阅读关注。为确保单个线程可以读取自己的写入,请对副本集的主对象使用“majority”读取关注和“majority”写入关注。要使用的关注"majority",您必须指定一个非空query条件。3.2版中的新功能。
collation 文献 可选的.指定 用于操作的排序规则。归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。排序规则选项具有以下语法:{locale: <string>,caseLevel: <boolean>,caseFirst: <string>,strength: <int>,numericOrdering: <boolean>,alternate: <string>,maxVariable: <string>,backwards: <boolean>}指定排序规则时,该locale字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见整理文档。如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料db.createCollection()),则该操作将使用为集合指定的排序规则。如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。3.4版的新功能。

count()等价于 db.collection.find(query).count()构造。

也可以看看

特性

Count和事务

您不能在事务中使用count和shell辅助函数count()和db.collection.count()。

分片群集

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

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

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

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

$count阶段等效于以下$ group+ $project序列:

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

索引使用

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

1
{ a: 1, b: 1 }

执行计数时,在以下情况下,MongoDB仅可以使用索引返回计数:

  • 查询可以使用索引.
  • 该查询仅包含索引键上的条件.
  • 查询谓词访问单个连续范围的索引键.

例如,以下操作可以仅使用索引返回计数:

1
2
3
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还必须读取文档返回计数。

1
2
3
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会将文档分页到内存中,以便随后进行相同计数操作的调用将具有更好的性能。

意外关机后的精度

mongod使用Wired Tiger存储引擎不正常关闭后,所报告的计数统计信息 count()可能不准确。

漂移量取决于在最后一个检查点与异常关闭之间执行的插入,更新或删除操作的数量。检查点通常每60秒出现一次。但是,以非默认–syncdelay设置运行的mongod实例可能具有或多或少的频繁检查点。

在不正常关机后,对mongod上的每个集合运行validate以恢复正确的统计信息。

注意

这种准确性的损失仅适用于不包含查询谓词的count()操作。

客户端断开

从MongoDB 4.2开始,如果发出db.collection.count()的客户端在操作完成之前断开连接,则MongoDB会将db.collection.count()标记为终止(即操作上的killOp)。

例子

计算集合中的所有文档

要计算orders集合中所有文档的数量,请使用以下操作:

1
db.orders.count()

此操作等效于以下操作:

1
db.orders.find().count()

计算与查询匹配的所有文档

计算ord_dt字段大于new Date('01/01/2012')的订单集合中的文档数:

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

该查询等效于以下内容:

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

estimatedDocumentCount

版本4.0.3中的新功能。

返回集合或视图中所有文档的计数。该方法包装count命令。

1
db.collection.estimatedDocumentCount( <options> )
参数 类型 描述
options 文献 可选的。影响计数行为的其他选项。

该options文档可以包含以下内容:

领域 类型 描述
maxTimeMS 整数 可选的。允许计数运行的最长时间。

特性

Mechanics

db.collection.estimatedDocumentCount() 不使用查询过滤器,而是使用元数据返回集合的计数。

分片群集

在分片群集上,结果计数将无法正确过滤出 孤立的文档。

不干净的关机

mongod使用Wired Tiger存储引擎不正常关闭后,所报告的计数统计信息 db.collection.estimatedDocumentCount()可能不准确。

漂移量取决于在最后一个检查点与异常关闭之间执行的插入,更新或删除操作的数量。检查点通常每60秒出现一次。但是,以非默认–syncdelay设置运行的mongod实例可能具有或多或少的频繁检查点。

在不正常关机后,对mongod上的每个集合运行validate以恢复正确的统计信息。

客户端断开

从MongoDB 4.2开始,如果发出db.collection.estimatedDocumentCount() 断开连接的客户端在操作完成之前断开连接,则MongoDB将标记db.collection.estimatedDocumentCount()为终止(即killOp在操作上)。

例子

以下示例用于 db.collection.estimatedDocumentCount检索orders集合中所有文档的计数:

1
db.orders.estimatedDocumentCount({})

distinct

此页面记录了mongoshell方法,并且 没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的 MongoDB驱动程序文档。

在单个集合或视图中查找指定字段的不同值,并将结果返回到数组中。

参数 类型 描述
field 要为其返回不同值的字段。
query 文献 一个查询,指定要从中检索不同值的文档。
options 文献 可选的。指定选项的文档。请参阅选项。

该db.collection.distinct()方法为distinct命令提供了包装。

注意

结果不得大于最大BSON大小。如果结果超过最大BSON大小,使用聚合管道检索使用不同的值$group运算符,如描述 检索与聚合管道重复值。

选项

1
{ collation: <document> }
领域 类型 描述
collation 文献 可选的.指定 用于操作的排序规则。归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。排序规则选项具有以下语法:{locale: <string>,caseLevel: <boolean>,caseFirst: <string>,strength: <int>,numericOrdering: <boolean>,alternate: <string>,maxVariable: <string>,backwards: <boolean>}指定排序规则时,该locale字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见整理文档。如果未指定排序规则,但是集合具有默认排序规则(请参阅参考资料db.createCollection()),则该操作将使用为集合指定的排序规则。如果没有为集合或操作指定排序规则,则MongoDB使用先前版本中使用的简单二进制比较进行字符串比较。您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。3.4版的新功能。

特性

在分片群集中,该distinct命令可能返回 孤立的文档。

数组字段

如果指定的值field是一个数组, db.collection.distinct()则将数组的每个元素视为一个单独的值。

例如,如果一个字段的值[1,[1],1],则db.collection.distinct()将1,[1]和1视为单独的值。

索引使用

如果可能,db.collection.distinct()操作可以使用索引。

索引也可以涵盖 db.collection.distinct()操作。

事务

在事务中执行不同的操作:

  • 对于未分片的集合,可以使用db.collection.distinct()方法/ distinct命令以及带有$group阶段的聚合管道。

  • 对于分片集合,不能使用db.collection.distinct()方法或单独的命令。要查找分片集合的不同值,请使用带有$group阶段的聚合管道。有关详细信息,请参见“区别操作”。

重要

在大多数情况下,与单文档写入相比,多文档事务产生的性能成本更高,并且多文档事务的可用性不应代替有效的架构设计。在许多情况下, 非规范化数据模型(嵌入式文档和数组)对于您的数据和用例将继续是最佳的。也就是说,在许多情况下,对数据进行适当的建模将最大程度地减少对多文档事务的需求。

客户端断开

从MongoDB 4.2开始,如果发出db.collection.distinct() 断开连接的客户端在操作完成之前断开连接,则MongoDB将标记db.collection.distinct()为终止(即killOp在操作上)。

例子

这些示例使用inventory包含以下文档的集合:

1
2
3
4
{ "_id": 1, "dept": "A", "item": { "sku": "111", "color": "red" }, "sizes": [ "S", "M" ] }
{ "_id": 2, "dept": "A", "item": { "sku": "111", "color": "blue" }, "sizes": [ "M", "L" ] }
{ "_id": 3, "dept": "B", "item": { "sku": "222", "color": "blue" }, "sizes": "S" }
{ "_id": 4, "dept": "A", "item": { "sku": "333", "color": "black" }, "sizes": [ "S" ] }

返回字段的不同值

下面的示例返回集合中dept所有文档的字段的不同值 inventory:

1
db.inventory.distinct( "dept" )

该方法返回以下不同dept值的数组:

1
[ "A", "B" ]

返回嵌入式字段的不同值

下面的示例从inventory集合中的所有文档返回嵌入在item字段中的sku字段的不同值:

1
db.inventory.distinct( "item.sku" )

该方法返回以下不同sku值的数组:

1
[ "111", "222", "333" ]

返回数组字段的不同值

下面的示例返回inventory集合中所有文档的sizes字段的不同值 :

1
db.inventory.distinct( "sizes" )

该方法返回以下不同sizes值的数组:

1
[ "M", "S", "L" ]

用指定查询distinct

下面的示例从dept等于“A”的文档中返回嵌入在item字段中的sku字段的不同值:

1
db.inventory.distinct( "item.sku", { dept: "A" } )

该方法返回以下不同sku值的数组:

1
[ "111", "333" ]

指定归类

3.4版的新功能。

归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。

集合myColl包含以下文档:

1
2
3
{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }

以下聚合操作包括“排序规则”选项:

1
db.myColl.distinct( "category", {}, { collation: { locale: "fr", strength: 1 } } )

有关整理字段的说明,请参见整理文档