sort - Mongodb解释聚合框架



mongodb aggregate用法 (2)

MongoDB中的Aggregation框架是否有解释功能? 我无法在文档中看到它。

如果没有,还有其他方法可以检查,查询在聚合框架中的表现如何?

我知道你找到了

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

https://src-bin.com


Answer #1

聚合框架是MongoDB中的一组分析工具,它允许我们对一个或多个集合中的文档运行各种类型的报告或分析。 基于管道的想法。 我们从MongoDB集合中获取输入,并通过一个或多个阶段传递该集合中的文档,每个阶段对输入执行不同的操作。 每个阶段都将输入前的阶段作为输入。 所有阶段的输入和输出都是一系列文件。 每个阶段都有一个特定的工作。 它期待一种特定的文档形式,并产生一个特定的输出,这本身就是一个文档流。 在流水线结束时,我们可以访问输出。

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

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


Answer #2

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

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

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

会给你想要的结果(文档here )。

对于旧版本> = 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中一样,Aggregation Framework explain选项提供了有关如何处理管道的信息,但不支持find()查询的executionStats模式的详细信息级别。 如果您专注于优化初始查询执行,您可能会发现使用executionStatsallPlansExecution冗长查看等价的find().explain()查询可能会allPlansExecution

在MongoDB问题跟踪器中关注更多详细的执行统计信息以帮助优化/配置聚合流水线,有几个相关的功能请求需要观看/





aggregation-framework