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()
答案 0 :(得分:135)
从MongoDB 3.0版开始,只需更改
的顺序即可collection.aggregate(...).explain()
到
collection.explain().aggregate(...)
将为您提供所需的结果(文档here)。
对于旧版本> = 2.6,您需要使用explain
option for aggregation pipeline operations
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服务器版本,还会有一些Aggregation Pipeline Optimizations自动发生。例如,可以合并和/或重新排序相邻的阶段以改善执行而不影响输出结果。
与MongoDB 3.4一样,聚合框架explain
选项提供有关如何处理管道的信息,但不支持与executionStats
查询的find()
模式相同的详细程度。如果您专注于优化初始查询执行,您可能会发现使用executionStats
or allPlansExecution
verbosity查看等效find().explain()
查询是有益的。
在MongoDB问题跟踪器中有一些相关的功能请求需要关注,以获取更详细的执行统计数据,以帮助优化/分析聚合管道:
答案 1 :(得分:27)
从版本 2.6.x开始 mongodb允许用户执行explain with aggregation framework。
您需要做的就是添加explain:true
db.records.aggregate(
[ ...your pipeline...],
{ explain: true }
)
感谢Rafa,我知道即使在2.4中也可以这样做,但只能通过runCommand()
。但现在你也可以使用聚合。
答案 2 :(得分:14)
聚合框架是MongoDB
中的一组分析工具,允许我们对一个或多个集合中的文档运行各种类型的报告或分析。基于管道的想法。我们从MongoDB
集合中获取输入,并将该集合中的文档传递到一个或多个阶段,每个阶段对其输入执行不同的操作。每个阶段都作为输入,无论在产生输出之前的阶段。所有阶段的输入和输出都是文档流。每个阶段都有一个特定的工作。它期望一种特定形式的文档并产生一个特定的输出,它本身就是一个文档流。在管道的末尾,我们可以访问输出。
单个阶段是数据处理单元。每个阶段一次一个地接受文档流,每次处理一个文档并产生文档的输出流。再一次,一次一个。每个阶段都提供一组旋钮或可调参数,我们可以控制这些旋钮或可调参数来参数化舞台以执行我们感兴趣的任务。因此,一个阶段执行一般任务 - 某种通用任务,并为我们正在使用的特定文档集参数化阶段。而这正是我们希望那个阶段与这些文件做的事情。这些可调参数通常采用我们可以提供的运算符的形式,它将修改字段,执行算术运算,重塑文档或执行某种累积任务以及各种其他事情。通常情况下,我们希望在单个管道中多次包含相同类型的阶段。
e.g。我们可能希望执行初始过滤器,以便我们不必将整个集合传递到我们的管道中。但是,稍后,在进行一些额外的处理之后,想要使用一组不同的标准再次过滤。因此,回顾一下,管道与MongoDB
集合一起工作。它们由阶段组成,每个阶段在其输入上执行不同的数据处理任务,并生成文档作为输出以传递到下一阶段。最后,在管道输出结束时,我们可以在应用程序中执行某些操作。在许多情况下,有必要在单个管道中多次包含相同类型的阶段。