MongoDB的单用途聚合
文章目录
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阶段对文档进行计数。例如,以下操作对集合中的文档进行计数:
|
|
$count阶段等效于以下$ group+ $project序列:
|
|
索引使用
考虑具有以下索引的集合:
|
|
执行计数时,在以下情况下,MongoDB仅可以使用索引返回计数:
- 查询可以使用索引.
- 该查询仅包含索引键上的条件.
- 查询谓词访问单个连续范围的索引键.
例如,以下操作可以仅使用索引返回计数:
|
|
但是,如果查询可以使用索引,但是查询谓词不能访问单个连续的索引键范围,或者查询还包含索引之外字段的条件,那么除了使用索引之外,MongoDB还必须读取文档返回计数。
|
|
在这种情况下,在初次读取文档期间,MongoDB会将文档分页到内存中,以便随后进行相同计数操作的调用将具有更好的性能。
意外关机后的精度
mongod使用Wired Tiger存储引擎不正常关闭后,所报告的计数统计信息 count()可能不准确。
漂移量取决于在最后一个检查点与异常关闭之间执行的插入,更新或删除操作的数量。检查点通常每60秒出现一次。但是,以非默认–syncdelay设置运行的mongod实例可能具有或多或少的频繁检查点。
在不正常关机后,对mongod上的每个集合运行validate以恢复正确的统计信息。
注意
这种准确性的损失仅适用于不包含查询谓词的count()操作。
客户端断开
从MongoDB 4.2开始,如果发出db.collection.count()的客户端在操作完成之前断开连接,则MongoDB会将db.collection.count()标记为终止(即操作上的killOp)。
例子
计算集合中的所有文档
要计算orders集合中所有文档的数量,请使用以下操作:
|
|
此操作等效于以下操作:
|
|
计算与查询匹配的所有文档
计算ord_dt字段大于new Date('01/01/2012')的订单集合中的文档数:
|
|
该查询等效于以下内容:
|
|
estimatedDocumentCount
版本4.0.3中的新功能。
返回集合或视图中所有文档的计数。该方法包装count命令。
|
|
| 参数 | 类型 | 描述 |
|---|---|---|
| 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集合中所有文档的计数:
|
|
distinct
此页面记录了mongoshell方法,并且 没有引用MongoDB Node.js驱动程序(或任何其他驱动程序)方法。对于相应的MongoDB驱动程序API,请改为参考您特定的 MongoDB驱动程序文档。
在单个集合或视图中查找指定字段的不同值,并将结果返回到数组中。
| 参数 | 类型 | 描述 |
|---|---|---|
| field | 串 | 要为其返回不同值的字段。 |
| query | 文献 | 一个查询,指定要从中检索不同值的文档。 |
| options | 文献 | 可选的。指定选项的文档。请参阅选项。 |
该db.collection.distinct()方法为distinct命令提供了包装。
注意
结果不得大于最大BSON大小。如果结果超过最大BSON大小,使用聚合管道检索使用不同的值$group运算符,如描述 检索与聚合管道重复值。
选项
|
|
| 领域 | 类型 | 描述 |
|---|---|---|
| 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包含以下文档的集合:
|
|
返回字段的不同值
下面的示例返回集合中dept所有文档的字段的不同值 inventory:
|
|
该方法返回以下不同dept值的数组:
|
|
返回嵌入式字段的不同值
下面的示例从inventory集合中的所有文档返回嵌入在item字段中的sku字段的不同值:
|
|
该方法返回以下不同sku值的数组:
|
|
返回数组字段的不同值
下面的示例返回inventory集合中所有文档的sizes字段的不同值 :
|
|
该方法返回以下不同sizes值的数组:
|
|
用指定查询distinct
下面的示例从dept等于“A”的文档中返回嵌入在item字段中的sku字段的不同值:
|
|
该方法返回以下不同sku值的数组:
|
|
指定归类
3.4版的新功能。
归类允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
集合myColl包含以下文档:
|
|
以下聚合操作包括“排序规则”选项:
|
|
有关整理字段的说明,请参见整理文档。
文章作者 Forz
上次更新 2020-05-17