Mongodb解释聚合框架

有没有MongoDB中的聚合框架的解释function? 我在文档中看不到它。

如果没有,还有其他一些方法来检查,查询如何在聚合框架内执行?

我知道你find了

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() 

从MongoDB版本3.0开始,只需更改命令即可

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

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

会给你想要的结果(文件在这里 )。

对于旧版本> = 2.6,您将需要使用explain选项进行聚合stream水线操作

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 } ) 

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

优化pipe道

通常,您可以通过以下方式优化聚合stream水线:

  • 使用$match阶段启动一个pipe道,将处理限制在相关文档中。
  • 确保最初的$match / $sort阶段由一个有效的索引支持。
  • 尽早使用$match$limit$skip过滤数据。
  • 最大限度地减less不必要的阶段和文件操作(如果需要复杂的聚合体操,也许重新考虑你的模式)。
  • 如果您升级了MongoDB服务器,则可以利用较新的聚合运算符。 例如,MongoDB 3.4添加了许多新的聚合阶段和expression式,包括支持处理数组,string和构面。

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

限制

在MongoDB 3.4中,Aggregation Framework explain选项提供了有关如何处理pipe道的信息,但不支持与find()查询的executionStats模式相同的详细级别。 如果您专注于优化初始查询执行,则可能会发现使用executionStatsallPlansExecution冗长度来查看等价的find().explain()查询是allPlansExecution

在MongoDB问题跟踪器中,有几个相关的function请求需要关注更多详细的执行统计信息,以帮助优化/configuration聚合pipe道:

  • SERVER-19758:添加“executionStats”和“allPlansExecution”解释模式来聚合解释
  • SERVER-21784:跟踪每个聚合pipe道阶段的执行统计信息并通过解释公开
  • SERVER-22622:改进$ lookup解释来指示“from”集合上的查询计划

从版本2.6.x开始,mongodb允许用户使用聚合框架进行解释 。

所有你需要做的就是添加解释:真实

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

感谢Rafa,我知道甚至可以在2.4中完成,但只能通过runCommand() 。 但现在你可以使用聚合。

聚合框架

聚合框架是MongoDB中的一组分析工具,它允许我们对一个或多个集合中的文档运行各种types的报告或分析。 基于pipe道的思想。 我们从MongoDB集合中获取input,并通过一个或多个阶段传递来自集合的文档,每个阶段对input执行不同的操作。 每个阶段都将输出之前的阶段作为input。 而所有阶段的input和输出都是一系列文件。 每个阶段都有一个特定的工作。 它期待着一个特定的文档forms,并产生一个特定的输出,这本身就是一个文档stream。 在pipe道的末端,我们可以访问输出。

聚合框架阶段

一个单独的舞台是一个数据处理单元。 每个阶段一次input一个文件stream,一次处理一个文件,产生文件的输出stream。 再次,一次一个。 每个阶段都提供一组旋钮或可调参数,我们可以通过参数化阶段来执行我们感兴趣的任务。 所以一个阶段执行一个通用的任务 – 一种通用的任务,并为我们正在使用的特定文档集合的舞台参数化。 正是我们想要的那个阶段,这些文件。 这些可调参数通常采用我们可以提供的操作符的forms,这些操作符将修改字段,执行算术运算,重塑文档或做某种累积任务以及一些其他事情。 通常情况下,我们希望在单个pipe道中多次包含相同types的舞台。

同一类型的舞台多次在一个单一的管道内

例如,我们可能希望执行一个初始filter,以便我们不必将整个集合传递到我们的pipe道中。 但是,稍后,在进行一些额外的处理之后,要使用不同的标准再次过滤。 所以,回顾一下,pipe道与MongoDB集合一起工作。 它们由阶段组成,每个阶段在其input上执行不同的数据处理任务,并生成文档作为输出传递到下一阶段。 最后在pipe道输出结束后,我们可以在我们的应用程序中做一些事情。 在许多情况下,必须在单个pipe道中多次包括相同types的阶段。