聚合框架的解释

MongoDB 中的聚合框架有解释函数吗? 我在文档中看不到。

如果没有其他检查方法,那么查询在聚合框架中是如何执行的?

我知道和发现你只是做

db.collection.find().explain()

但是在聚合框架中,我得到了一个错误

db.collection.aggregate(
{ $project : { "Tags._id" : 1 }},
{ $unwind : "$Tags" },
{ $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
{
$group:
{
_id : { id: "$_id"},
"count": { $sum:1 }
}
},
{ $sort: {"count":-1}}
).explain()
78406 次浏览

从 MongoDB 3.0版开始,只需将顺序从

collection.aggregate(...).explain()

collection.explain().aggregate(...)

将提供所需的结果(文档 给你)。

对于 > = 2.6的旧版本,需要使用 用于聚合管道操作的 explain选项

explain:true

db.collection.aggregate([
{ $project : { "Tags._id" : 1 }},
{ $unwind : "$Tags" },
{ $match: {$or: [{"Tags._id":"tag1"},{"Tags._id":"tag2"}]}},
{ $group: {
_id : "$_id",
count: { $sum:1 }
}},
{$sort: {"count":-1}}
],
{
explain:true
}
)

聚合框架的一个重要考虑因素是,索引只能用于获取管道的初始数据(例如,在管道开始时使用 $match$sort$geonear)以及随后的 $lookup$graphLookup阶段。一旦数据被提取到聚合管道中进行处理(例如,通过像 $project$unwind$group这样的阶段) ,进一步的操作将在内存中进行(如果设置了 allowDiskUse选项,则可能使用临时文件)。

优化管道

通常,可以通过以下方式优化聚合管道:

  • 启动具有 $match阶段的管道,以将处理限制在相关文档。
  • 确保初始 $match/$sort阶段由 有效率指数支持。
  • 尽早使用 $match$limit$skip过滤数据。
  • 最小化不必要的阶段和文档操作(如果需要复杂的聚合操作,可能需要重新考虑模式)。
  • 如果升级了 MongoDB 服务器,请利用新的聚合运算符。例如,MongoDB 3.4添加了许多 新的聚合阶段和表达式,包括对数组、字符串和方面的支持。

还有一些 聚合管道优化会根据 MongoDB 服务器版本自动发生。例如,相邻的阶段可以合并和/或重新排序,以在不影响输出结果的情况下改进执行。

限制

在 MongoDB 3.4中,聚合框架 explain选项提供了关于管道如何处理的信息,但是不支持与 find()查询的 executionStats模式相同的详细级别。如果您专注于优化初始查询执行,那么您可能会发现使用 ABC1或 allPlansExecution冗长检查等效的 find().explain()查询是有益的。

MongoDB 问题跟踪程序中有一些相关的特性请求,需要关注/更新更详细的执行统计数据,以帮助优化/配置聚合管道:

从版本 2.6. x mongodb 开始,用户可以执行 用聚合框架解释

你所需要做的就是添加解释: true

db.records.aggregate(
[ ...your pipeline...],
{ explain: true }
)

多亏了拉法,我知道即使在2.4版本也可以做到,但是只能通过 runCommand()。但是现在您也可以使用聚合。

The Aggregation framework

聚合框架是 MongoDB中的一组分析工具,它允许我们对一个或多个集合中的文档运行各种类型的报告或分析。基于管道的想法。我们从 MongoDB集合获取输入,并将来自该集合的文档传递到一个或多个阶段,每个阶段对其输入执行不同的操作。每个阶段都接受它产生之前的阶段作为输出。所有阶段的输入和输出都是文档流。每个阶段都有其特定的工作。它期望一种特定形式的文档,并生成一个特定的输出,这本身就是一个文档流。在管道的最后,我们可以访问输出。

aggregation framework stage

一个独立的阶段是一个数据处理单元。每个阶段一次输入一个文档流,一次处理一个文档并生成文档的输出流。再说一次,一个一个来。每个阶段都提供了一组旋钮或可调参数,我们可以控制这些旋钮或可调参数来参数化这个阶段,以执行我们感兴趣的任何任务。因此,一个阶段执行一个通用任务——某种通用任务,并参数化我们正在处理的特定文档集的阶段。我们希望在这个舞台上,对这些文件做些什么。这些可调参数通常采用操作符的形式,我们可以提供这些操作符来修改字段、执行算术操作、重塑文档形状或执行某种累积任务以及其他各种操作。通常情况下,我们希望在单个管道中多次包含相同类型的舞台。

same type of stage multiple times within a single pipeline

例如:。我们可能希望执行一个初始过滤器,这样就不必将整个集合传递到管道中。但是,随后,在进行一些额外的处理之后,希望再次使用一组不同的条件进行筛选。因此,简单地说,管道可以与 MongoDB集合一起工作。它们由多个阶段组成,每个阶段在其输入上执行不同的数据处理任务,并将文档作为输出传递给下一阶段。最后,在管道输出的末尾,我们可以在应用程序中做一些事情。在许多情况下,有必要在单个管道中多次包含相同类型的阶段。