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:truedb.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一样,Aggregation Framework explain选项提供有关如何处理管道但不支持与查询executionStats模式相同级别的详细信息的信息find().如果您专注于优化初始查询执行,您可能会发现find().explain()使用executionStats或allPlansExecution详细检查等效查询是有益的.
在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.
xam*_*mir 15
聚合框架是一组分析工具MongoDB,允许我们在一个或多个集合中的文档上运行各种类型的报告或分析.基于管道的想法.我们从MongoDB集合中获取输入并将该集合中的文档传递到一个或多个阶段,每个阶段对其输入执行不同的操作.每个阶段都作为输入,无论在产生输出之前的阶段.所有阶段的输入和输出都是文档流.每个阶段都有一个特定的工作.它期望一种特定形式的文档并产生一个特定的输出,它本身就是一个文档流.在管道的最后,我们可以访问输出.
单个阶段是数据处理单元.每个阶段一次一个地接受文档流,每次处理一个文档并产生文档的输出流.再一次,一次一个.每个阶段都提供一组旋钮或可调参数,我们可以控制这些旋钮或可调参数来参数化舞台以执行我们感兴趣的任务.因此,一个阶段执行一般任务 - 某种通用任务,并为我们正在使用的特定文档集参数化阶段.而这正是我们希望那个阶段与这些文件做的事情.这些可调参数通常采用我们可以提供的运算符的形式,它将修改字段,执行算术运算,重塑文档或执行某种累积任务以及各种其他事情.通常情况下,我们希望在单个管道中多次包含相同类型的阶段.
例如,我们可能希望执行初始过滤器,这样我们就不必将整个集合传递到管道中.但是,稍后,在进行一些额外的处理之后,想要使用一组不同的标准再次过滤.因此,回顾一下,管道与MongoDB集合一起工作.它们由阶段组成,每个阶段在其输入上执行不同的数据处理任务,并生成文档作为输出以传递到下一阶段.最后,在管道输出结束时,我们可以在应用程序中执行某些操作.在许多情况下,有必要在单个管道中多次包含相同类型的阶段.
| 归档时间: |
|
| 查看次数: |
51180 次 |
| 最近记录: |