aggregate

在本页面

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 PipelineAggregation Reference聚合管道限制的更多信息。

Sessions

会话空闲超时

从 MongoDB 3.6 开始,MongoDB 驱动程序和mongo shell 将所有操作与server session关联,但未确认的写操作除外。对于未与会话明确关联的操作(即使用Mongo.startSession()),MongoDB 驱动程序和mongo Shell 创建隐式会话并将其与该操作相关联。

如果会话空闲时间超过 30 分钟,则 MongoDB 服务器会将会话标记为已过期,并可以随时关闭它。当 MongoDB 服务器关闭会话时,它还会终止所有正在进行的操作并打开与该会话关联的游标。这包括配置为noCursorTimeoutmaxTimeMS大于 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 }
)

汇总指定批次大小的数据

要指定“初始”批处理大小,请在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操作指定后续批处理大小。 batchSize0表示第一批为空,如果您要快速获取游标或失败消息而又不做大量服务器端工作,则它很有用。

指定排序规则

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

从 MongoDB 3.6 开始,默认情况下启用对读取关注"majority"的支持。对于 MongoDB 3.6.1-3.6.x,您可以禁用阅读关注"majority"。有关更多信息,请参见禁用多数阅读关注

db.restaurants.aggregate(
   [ { $match: { rating: { $lt: 5 } } } ],
   { readConcern: { level: "majority" } }
)

为确保单个线程可以读取其自己的写入,请对副本集的主数据库使用"majority"读取关注和"majority"写入关注。

首页