On this page
aggregate
在本页面
aggregate
- 使用aggregation pipeline执行聚合操作。管道允许用户使用一系列基于阶段的操作来处理来自集合或其他来源的数据。
Syntax
该命令具有以下语法:
在版本 3.6 中更改。
{
aggregate: "<collection>" || 1,
pipeline: [ <stage>, <...> ],
explain: <boolean>,
allowDiskUse: <boolean>,
cursor: <document>,
maxTimeMS: <int>,
bypassDocumentValidation: <boolean>,
readConcern: <document>,
collation: <document>,
hint: <string or document>,
comment: <string>,
writeConcern: <document>
}
Tip
大多数用户应该直接使用mongo shell 中提供的db.collection.aggregate() helper 或驱动程序中的等效帮助程序,而不是直接运行aggregate命令。在 2.6 及更高版本中,db.collection.aggregate()帮助程序始终返回游标。
Command Fields
aggregate命令采用以下字段作为参数:
Field | Type | Description | |
---|---|---|---|
aggregate |
string | 充当聚合管道 Importing 的集合或视图的名称。使用1 来收集不可知的命令。 |
|
pipeline |
array | 聚合管道阶段数组,用于处理和转换文档流,作为聚合管道的一部分。 | |
explain |
boolean | 可选的。指定返回有关管道处理的信息。 | |
allowDiskUse | boolean | 可选的。允许写入临时文件。设置为true 时,大多数聚合阶段可以将数据写入dbPath目录中的_tmp 子目录,但以下情况除外: |
|
$graphLookup stage $group阶段中使用的$addToSet累加器表达式(从版本 3.6.17 开始) $group阶段中使用的$push累加器表达式(从版本 3.6.17 开始) |
|||
cursor |
document | 指定一个包含控制光标对象创建的选项的文档。 在版本 3.6 中进行了更改:MongoDB 3.6 无需使用aggregate命令而无需使用 cursor 选项,除非该命令包含explain 选项,否则**。除非包含explain 选项,否则必须指定游标选项。要指示具有默认批处理大小的光标,请指定 cursor: {} 。要使用非默认批处理大小指示光标,请使用 cursor: { batchSize: <num> } 。 |
。 |
maxTimeMS |
非负整数 | 可选。指定用于游标的处理操作的时间限制(以毫秒为单位)。如果未为 maxTimeMS 指定值,则操作不会超时。值0 明确指定默认的无限制行为。MongoDB 使用与db.killOp()相同的机制终止超出其分配的时间限制的操作。 MongoDB 仅在其指定的interrupt points之一处终止操作。 |
|
bypassDocumentValidation |
布尔值 | 可选。仅当您指定$out聚合运算符时才可用。 使 aggregate 在操作过程中绕过文档验证。这使您可以插入不符合验证要求的文档。版本 3.2 中的新功能。 |
|
readConcern |
文档 | 可选。指定read concern。 readConcern 选项具有以下语法: 在版本 3.6 中更改。 readConcern: { level: <value> } 可能的阅读关注级别为: "local"。这是默认的阅读关注级别。 "available"。当未指定读取操作和因果一致的会话和“ level”时,这是针对次要对象的读取的默认值。查询返回实例的最新数据。 "majority"。可用于使用WiredTiger 存储引擎的副本集。 "linearizable"。仅可用于primary上的读取操作。 有关阅读关注级别的更多信息,请参阅阅读关注级别。 对于"local"(默认)或"majority"读关注级别,您可以指定 afterClusterTime 选项以使读操作返回满足级别要求和在群集时间之后指定的数据。有关更多信息,请参见读取操作和因果一致的会话。 |
|
collation |
文档 | 可选。 指定用于操作的collation。 Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。 排序规则选项具有以下语法: collation: { locale: <string>, caseLevel: <boolean>, caseFirst: <string>, strength: <int>, numericOrdering: <boolean>, alternate: <string>, maxVariable: <string>, backwards: <boolean> } 指定排序规则时, locale 字段为必填字段;所有其他排序规则字段都是可选的。有关字段的说明,请参见Collation Document。如果未指定排序规则,但是集合具有默认排序规则(请参见db.createCollection()),则该操作将使用为集合指定的排序规则。 如果没有为集合或操作指定排序规则,则 MongoDB 使用先前版本中使用的简单二进制比较进行字符串比较。 您不能为一个操作指定多个排序规则。例如,您不能为每个字段指定不同的排序规则,或者如果对排序执行查找,则不能对查找使用一种排序规则,而对排序使用另一种排序规则。 3.4 版中的新功能。 |
|
hint |
字符串或文档 | 可选。用于聚合的索引。索引位于运行聚合的初始集合/视图上。 通过索引名称或索引规范文档指定索引。 |
Note
hint
不适用于$lookup和$graphLookup阶段。
3.6 版中的新功能。
| comment
|字符串|可选。用户可以指定任意字符串,以帮助通过数据库概要分析器,currentOp 和日志来跟踪操作。
3.6 版中的新功能。
| writeConcern
|文档|可选。表示要与$out阶段一起使用的write concern的文档。
忽略在$out阶段使用默认的写关注。
有关聚合管道Aggregation Pipeline,Aggregation Reference和聚合管道限制的更多信息。
Sessions
会话空闲超时
从 MongoDB 3.6 开始,MongoDB 驱动程序和mongo shell 将所有操作与server session关联,但未确认的写操作除外。对于未与会话明确关联的操作(即使用Mongo.startSession()),MongoDB 驱动程序和mongo
Shell 创建隐式会话并将其与该操作相关联。
如果会话空闲时间超过 30 分钟,则 MongoDB 服务器会将会话标记为已过期,并可以随时关闭它。当 MongoDB 服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括配置为noCursorTimeout或maxTimeMS大于 30 分钟的光标。
对于返回游标的操作,如果游标可能闲置了 30 分钟以上,请在使用Session.startSession()
的显式会话中发出操作,并使用refreshSessions命令定期刷新该会话。有关更多信息,请参见会话空闲超时。
Example
在版本 3.4 中进行了更改:MongoDB 3.6 删除了不使用aggregate命令的情况,而没有使用cursor
选项,除非该命令包含explain
选项。除非包含explain
选项,否则必须指定游标选项。
要指示具有默认批处理大小的光标,请指定cursor: {}
。
要使用非默认批处理大小指示光标,请使用cursor: { batchSize: <num> }
。
大多数用户应该直接使用mongo shell 中提供的db.collection.aggregate() helper 或驱动程序中的等效帮助程序,而不是直接运行aggregate命令。在 2.6 及更高版本中,db.collection.aggregate()帮助程序始终返回游标。
除了前两个示例演示命令语法外,此页面中的示例都使用db.collection.aggregate()帮助器。
使用多阶段管道聚合数据
集合articles
包含以下文档:
{
_id: ObjectId("52769ea0f3dc6ead47c9a1b2"),
author: "abc123",
title: "zzz",
tags: [ "programming", "database", "mongodb" ]
}
下面的示例对articles
集合执行aggregate操作,以计算出现在该集合中的tags
数组中每个不同元素的计数。
db.runCommand( {
aggregate: "articles",
pipeline: [
{ $project: { tags: 1 } },
{ $unwind: "$tags" },
{ $group: { _id: "$tags", count: { $sum : 1 } } }
],
cursor: { }
} )
在mongo shell 中,此操作可以使用db.collection.aggregate()帮助器,如下所示:
db.articles.aggregate( [
{ $project: { tags: 1 } },
{ $unwind: "$tags" },
{ $group: { _id: "$tags", count: { $sum : 1 } } }
] )
在 Management 数据库上使用$ currentOp
以下示例在 admin 数据库上运行具有两个阶段的管道。第一阶段运行$currentOp操作,第二阶段过滤该操作的结果。
db.adminCommand( {
aggregate : 1,
pipeline : [ {
$currentOp : { allUsers : true, idleConnections : true } }, {
$match : { shard : "shard01" }
}
],
cursor : { }
} )
Note
aggregate命令未指定集合,而是采用\ {aggregate: 1}的形式。这是因为初始$currentOp阶段不会从集合中获取 Importing。它产生自己的数据,供管道的其余部分使用。
添加了新的db.aggregate()帮助器,以帮助运行诸如此类的无集合聚合。上面的汇总也可以像this示例一样运行。
返回有关汇总操作的信息
以下聚合操作将可选字段explain
设置为true
,以返回有关聚合操作的信息。
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } }
],
{ explain: true }
)
Note
explain
输出在各个发行版之间可能有所更改。
See also
db.collection.aggregate() method
使用外部排序汇总数据
聚合管道阶段具有最大内存使用限制。要处理大型数据集,请将allowDiskUse
选项设置为true
以启用将数据写入临时文件,如以下示例所示:
db.stocks.aggregate( [
{ $project : { cusip: 1, date: 1, price: 1, _id: 0 } },
{ $sort : { cusip : 1, date: 1 } }
],
{ allowDiskUse: true }
)
See also
汇总指定批次大小的数据
要指定“初始”批处理大小,请在cursor
字段中指定batchSize
,如以下示例所示:
db.orders.aggregate( [
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } },
{ $sort: { total: -1 } },
{ $limit: 2 }
],
{ cursor: { batchSize: 0 } }
)
{batchSize: 0 }
文档仅指定“初始”批处理大小的大小。与其他 MongoDB 游标一样,为OP_GET_MORE操作指定后续批处理大小。 batchSize
或0
表示第一批为空,如果您要快速获取游标或失败消息而又不做大量服务器端工作,则它很有用。
指定排序规则
3.4 版的新功能。
Collation允许用户为字符串比较指定特定于语言的规则,例如字母大写和重音符号的规则。
集合myColl
具有以下文档:
{ _id: 1, category: "café", status: "A" }
{ _id: 2, category: "cafe", status: "a" }
{ _id: 3, category: "cafE", status: "a" }
以下聚合操作包括Collation选项:
db.myColl.aggregate(
[ { $match: { status: "A" } }, { $group: { _id: "$category", count: { $sum: 1 } } } ],
{ collation: { locale: "fr", strength: 1 } }
);
有关整理字段的说明,请参见Collation Document。
提示索引
3.6 版的新功能。
创建包含以下文档的集合foodColl
:
db.foodColl.insert([
{ _id: 1, category: "cake", type: "chocolate", qty: 10 },
{ _id: 2, category: "cake", type: "ice cream", qty: 25 },
{ _id: 3, category: "pie", type: "boston cream", qty: 20 },
{ _id: 4, category: "pie", type: "blueberry", qty: 15 }
])
创建以下索引:
db.foodColl.createIndex( { qty: 1, type: 1 } );
db.foodColl.createIndex( { qty: 1, category: 1 } );
以下聚合操作包括hint
选项,以强制使用指定的索引:
db.foodColl.aggregate(
[ { $sort: { qty: 1 }}, { $match: { category: "cake", qty: 10 } }, { $sort: { type: -1 } } ],
{ hint: { qty: 1, category: 1 } }
)
覆盖默认读取问题
要覆盖默认的阅读关注级别"local",请使用readConcern
选项。 getMore命令使用在原始aggregate命令中指定的readConcern
级别。
对副本集的以下操作指定read concern到"majority"来读取已确认已写入大多数节点的数据的最新副本。
Important
- 要使用read concern级别"majority",副本集必须使用WiredTiger 存储引擎和选举协议版本 1。
从 MongoDB 3.6 开始,默认情况下启用对读取关注"majority"的支持。对于 MongoDB 3.6.1-3.6.x,您可以禁用阅读关注"majority"。有关更多信息,请参见禁用多数阅读关注。
要使用read concern级别"majority",不能包含$out阶段。
无论read concern级别如何,节点上的最新数据都可能无法反映系统中数据的最新版本。
db.restaurants.aggregate(
[ { $match: { rating: { $lt: 5 } } } ],
{ readConcern: { level: "majority" } }
)
为确保单个线程可以读取其自己的写入,请对副本集的主数据库使用"majority"读取关注和"majority"写入关注。
See also