Mongodb Explain for Aggregation framework

25 浏览
0 Comments

Mongodb Explain for Aggregation framework

MongoDB的聚合框架是否有解释(explain)函数?我在文档中没有看到它。\n如果没有,是否有其他方法可以检查聚合框架中查询的性能?\n我知道使用find可以这样做:\n

db.collection.find().explain()

\n但是在聚合框架中,我会得到一个错误:\n

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
0 Comments

MongoDB的聚合框架是一组分析工具,允许我们在一个或多个集合中运行各种类型的报告或分析。它基于一个流水线的概念。我们从一个MongoDB集合中获取输入,并通过一个或多个阶段将该集合中的文档传递给它们的输入。每个阶段的输入是前一个阶段产生的输出。所有阶段的输入和输出都是一系列文档。每个阶段都有特定的任务。它期望特定形式的文档,并产生一个特定的输出,该输出本身就是一系列文档。在流水线的末尾,我们可以访问输出。

每个阶段是一个数据处理单元。每个阶段逐个处理一次输入流中的文档,并生成一次输出流中的文档。每个阶段提供一组可控制的旋钮或可调参数,用于参数化阶段以执行我们感兴趣的任务。因此,一个阶段执行通用任务-某种类型的通用任务,并对我们正在处理的特定文档集参数化阶段。这些可调参数通常采用我们可以提供的运算符的形式,这些运算符将修改字段、执行算术运算、重塑文档或执行某种累积任务以及其他各种任务。通常情况下,我们希望在单个流水线中多次包含相同类型的阶段。

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

感谢,这篇文章对于深入理解MongoDB的聚合框架很有帮助。

0
0 Comments

Mongodb的版本从2.6.x开始,允许用户在聚合框架中使用explain。只需要在查询中添加explain: true参数即可。例如:

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

在2.4版本中,只能通过runCommand()方法来实现这个功能。但是从2.6版本开始也可以使用aggregate方法。

实际上,从MongoDB 2.2版本开始,也可以通过db.collection.runCommand('aggregate', {pipeline: [PIPELINE], explain: true})来解释聚合操作。

在2.2和2.4版本中,只能通过runCommand方法来解释聚合操作。感谢您的点赞。

虽然在2.6版本之前的版本中可以通过runCommand方法来解释聚合操作,但是不能保证产生正确的结果,因此不建议使用。建议只在2.5.3版本或更新版本中使用此功能(在2.6正式发布之前可能仍然存在一些潜在的bug)。

0
0 Comments

Mongodb聚合框架的Explain问题的原因是在MongoDB 3.0版本之后,更改聚合操作的顺序会得到所需的结果。解决方法是将

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

改为

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

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

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

优化管道的方法有:

- 从$match阶段开始,限制处理相关文档。

- 确保初始的$match/$sort阶段使用高效的索引。

- 早期使用$match$limit$skip过滤数据。

- 最小化不必要的阶段和文档操作(如果需要复杂的聚合操作,可能需要重新考虑模式)。

- 如果已升级MongoDB服务器,可以利用较新的聚合操作符。例如,MongoDB 3.4添加了许多新的聚合阶段和表达式,包括对数组、字符串和facet的支持。

根据MongoDB服务器版本的不同,还会自动发生一些聚合管道优化。例如,相邻的阶段可能会被合并和/或重新排序,以提高执行效率而不影响输出结果。

至于限制方面,截至MongoDB 3.4,聚合框架的explain选项提供了有关管道如何处理的信息,但不支持与find()查询的executionStats模式相同的详细级别。如果你关注优化初始查询执行,可能会发现查看等效的find().explain()查询以及executionStatsallPlansExecution详细信息是有益的。

关于更详细的执行统计信息以帮助优化/分析聚合管道,MongoDB问题跟踪器中有一些相关的特性请求,可以关注/投票:

- SERVER-19758: 添加"executionStats"和"allPlansExecution" explain模式到聚合explain

- SERVER-21784: 跟踪每个聚合管道阶段的执行统计信息,并通过explain公开

- SERVER-22622: 改进$lookup explain,指示"from"集合的查询计划

以上问题在3.6版本中已得到解决,现在可以发出类似于"db.price_per_minute.explain("executionStats").aggregate(["...的查询。

感谢提供信息,我会看看是否可以做出任何更改。

0