Mongodb解释聚合框架

SCB*_*SCB 108 mongodb aggregation-framework

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

如果没有其他方法可以检查,查询如何在聚合框架内执行?

我知道发现你就是这么做的

db.collection.find().explain()
Run Code Online (Sandbox Code Playgroud)

但是使用聚合框架我得到一个错误

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()
Run Code Online (Sandbox Code Playgroud)

Ste*_*nie 154

从MongoDB 3.0版开始,只需更改订单即可

collection.aggregate(...).explain()
Run Code Online (Sandbox Code Playgroud)

collection.explain().aggregate(...)
Run Code Online (Sandbox Code Playgroud)

将给你想要的结果(文件在这里).

对于旧版本> = 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
  }
)
Run Code Online (Sandbox Code Playgroud)

与聚合框架的一个重要考虑是,索引只能用于为管道获取初始数据(例如的用法 $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选项提供有关如何处理管道但不支持与查询executionStats模式相同级别的详细信息的信息find().如果您专注于优化初始查询执行,您可能会发现find().explain()使用executionStatsallPlansExecution详细检查等效查询是有益的.

在MongoDB问题跟踪器中有一些相关的功能请求需要观察/ upvote,以获取更详细的执行统计数据,以帮助优化/分析聚合管道:


Sal*_*ali 27

Starting with version 2.6.x mongodb allows users to do explain with aggregation framework.

All you need to do is to add explain : true

db.records.aggregate(
  [ ...your pipeline...],
  { explain: true }
)
Run Code Online (Sandbox Code Playgroud)

Thanks to Rafa, I know that it was possible to do even in 2.4, but only through runCommand(). But now you can use aggregate as well.

  • 实际上,您可以使用`db.collection.runCommand('aggregate',{pipeline:[PIPELINE],explain:true})`来解释自MongoDB 2.2以来的聚合. (5认同)
  • 虽然该选项在技术上通过2.6之前的runCommand存在,但不能保证产生正确的结果,不应该提倡.你应该只在2.5.3或更新版本中使用它(并且预计在2.6版本发布之前可能仍然存在一些漏洞). (3认同)

xam*_*mir 15

聚合框架

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

聚合框架阶段

单个阶段是数据处理单元.每个阶段一次一个地接受文档流,每次处理一个文档并产生文档的输出流.再一次,一次一个.每个阶段都提供一组旋钮或可调参数,我们可以控制这些旋钮或可调参数来参数化舞台以执行我们感兴趣的任务.因此,一个阶段执行一般任务 - 某种通用任务,并为我们正在使用的特定文档集参数化阶段.而这正是我们希望那个阶段与这些文件做的事情.这些可调参数通常采用我们可以提供的运算符的形式,它将修改字段,执行算术运算,重塑文档或执行某种累积任务以及各种其他事情.通常情况下,我们希望在单个管道中多次包含相同类型的阶段.

在单个管道中多次执行相同类型的阶段

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