Mongodb 聚合查询花费的时间太长

Mongodb 聚合查询花费的时间太长,mongodb,performance,aggregation-framework,nosql,Mongodb,Performance,Aggregation Framework,Nosql,我在最新版本的MongoDB中使用聚合框架进行了查询。问题是,我找不到获得结果的方法,因为这需要太长时间,而且过程崩溃 收藏 Constructora包含50000份文档(包括嵌入式文档等) 变量包含400.000个文档,包括嵌入文档 { _id:1 medicion_departamento: [ { _id:1, valmax:40 id_departamento:6,

我在最新版本的MongoDB中使用聚合框架进行了查询。问题是,我找不到获得结果的方法,因为这需要太长时间,而且过程崩溃

收藏 Constructora包含50000份文档(包括嵌入式文档等)

变量包含400.000个文档,包括嵌入文档

{
    _id:1
    medicion_departamento: [
        {
            _id:1,
            valmax:40
            id_departamento:6,
            ...
        },
        ...
    ]
},
{
    _id: 2,
    medicion_departamento: [...]
},
...
{
    _id:1,
    id_departamento: 6,
    id_variable: 1,
    valor: 6269
},
{
    _id:2,
    ...
},
...
Medicion拥有8.000.000份文档

{
    _id:1
    medicion_departamento: [
        {
            _id:1,
            valmax:40
            id_departamento:6,
            ...
        },
        ...
    ]
},
{
    _id: 2,
    medicion_departamento: [...]
},
...
{
    _id:1,
    id_departamento: 6,
    id_variable: 1,
    valor: 6269
},
{
    _id:2,
    ...
},
...
查询 我想获得部门地址(
PAI、provincia、ciudad、Departmento.nombre
)超过“medicion”中“variable”fives time字段
valor
中的
valmax
值。我的问题是:

db.constructora.aggregate([
        {$unwind:"$edificio"},
        {$unwind:"$edificio.departamento"},
        {$lookup: 
        {
            from: "variable",
            localField: "edificio.departamento._id",
            foreignField: "medicion_departamento.id_departamento",
            as: "var"
        }
        },
        {$unwind: "$var"},
        {$unwind: "$var.medicion_departamento"},
        {$match: {"var.nombre":"electricidad"}},
        {$lookup: 
            {
                from: "medicion",
                localField: "var.medicion_departamento.id_departamento",
                foreignField: "id_departamento",
                as: "med"
            }
        },
        {$unwind:"$med"},
        {$project:{"id_dto":"med.id_departamento", "consumo":"$med.valor","valorMult":{$multiply:["$var.valmax",5]}, "edificio.pais":1, "edificio.provincia":1, "edificio.direccion":1, "edificio.departamento.nombre_depto":1}},
        {$match:{"consumo":{$gt:"valorMult"}}},
        {$group:{_id:{"a": "edificio.pais", "b":"edificio.provincia", "c":"edificio.direccion", "d":"edificio.departamento.nombre_depto"}}}
]);
当我删除管道中的最后一个匹配和组时,查询将以0.08秒的时间返回数据,但当我使用匹配和组运行此查询时,它将一直运行,直到进程崩溃。我能做些什么来修复(或优化)它


谢谢

您的结构在这里对您没有帮助,我之前已经说过,如果目标
“foreignField”
实际位于数组中,则使用
$lookup
将实际返回“整个文档”,而不仅仅是数组成员。您似乎没有做出任何努力来“减少”“这些信息仅适用于匹配的数组成员,这将是
$lookup
的逻辑点。”。您应该尝试这样做,因为当
$lookup
后面跟着
$unwind
,然后是
$match
,实际上所有三个阶段都作为一个阶段发送。而且
{$match:{“consumo”:{$gt:“valorMult”}
并没有做“您认为”的事情。您正在尝试“比较字段”,但这不是
$match
所做的。相反,您需要
$redact
。事实上,你根本不应该
$project
。至于“花费的时间”,您看到的
0.08s
只是选择光标和检索前25个文档。通过各种
$lookup
$unwind
阶段,您拥有的文档远远多于等待处理的原始源文档。这需要一些时间来处理。总的来说,看起来数据需要重组。@NeilLunn我必须用这个结构来做,我根本不能改变模式。这是因为我不是owner@NeilLunn如果我将“variable”和它的嵌入式数组(medicion_departamento)分成两个不同的集合,你认为我可以花更多的时间吗?应该有“某种程度”的改进是的。但我基本上是说要考虑第一个“连接”。除了最初的
$unwind
语句(当然代价高昂)之外,“连接”的数据驻留在一个数组中。这意味着返回的不是“匹配的数组元素”,而是包含任何匹配数组元素的“整个”
“变量”
文档。作为第一步,您“应该”删除任何不匹配的数组元素。您的结构在这里对您没有帮助,在此之前,我已经使用
$lookup
对目标
“foreignField”
实际位于数组中的位置进行了注释,它将实际返回“整个文档”,而不仅仅是数组成员。您似乎没有做出任何努力将此类信息“减少”到仅匹配的数组成员,这将是
$lookup
的逻辑点。您应该尝试这样做,因为当
$lookup
后面跟着
$unwind
,然后是
$match
,实际上所有三个阶段都作为一个阶段发送。而且
{$match:{“consumo”:{$gt:“valorMult”}
并没有做“您认为”的事情。您正在尝试“比较字段”,但这不是
$match
所做的。相反,您需要
$redact
。事实上,你根本不应该
$project
。至于“花费的时间”,您看到的
0.08s
只是选择光标和检索前25个文档。通过各种
$lookup
$unwind
阶段,您拥有的文档远远多于等待处理的原始源文档。这需要一些时间来处理。总的来说,看起来数据需要重组。@NeilLunn我必须用这个结构来做,我根本不能改变模式。这是因为我不是owner@NeilLunn如果我将“variable”和它的嵌入式数组(medicion_departamento)分成两个不同的集合,你认为我可以花更多的时间吗?应该有“某种程度”的改进是的。但我基本上是说要考虑第一个“连接”。除了最初的
$unwind
语句(当然代价高昂)之外,“连接”的数据驻留在一个数组中。这意味着返回的不是“匹配的数组元素”,而是包含任何匹配数组元素的“整个”
“变量”
文档。作为第一步,您“应该”删除任何不匹配的数组元素。