聚合查询需要太长时间

时间:2017-07-23 19:07:10

标签: mongodb performance aggregation-framework nosql

我使用最新版MongoDB中的聚合框架进行了查询。问题是我无法找到获得结果的方法,因为它花费的时间太长而且进程崩溃。

集合

Constructora 包含50.000个文档(包括嵌入式文档等)

{
    _id: 1,
    edificio: [
        {
            _id:58,
            pais: "Argentina",
            provincia: "Buenos Aires",
            ciudad: "Tandil",
            direccion: "9 de Julio 845",
            departamento: [
                {
                    _id:45648651867,
                    nombre_depto: "a"
                },   
                ...
            ]
        }
        ...
    ]
},
{
    _id:2,
    edificio: [...],
    ...
}
...

变量包含400,000个文档,包括嵌入文档。

{
    _id:1
    medicion_departamento: [
        {
            _id:1,
            valmax:40
            id_departamento:6,
            ...
        },
        ...
    ]
},
{
    _id: 2,
    medicion_departamento: [...]
},
...

Medicion ,包含8.000.000个文档。

{
    _id:1,
    id_departamento: 6,
    id_variable: 1,
    valor: 6269
},
{
    _id:2,
    ...
},
...

查询

我希望部门(pais, provincia, ciudad, departamento.nombre)的地址超过"变量"中的valmax值。在#34; medicion"中的五分之一时间valor。我的疑问是:

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.08s中的数据,但是当我使用match和group运行它时,它将一直运行,直到进程崩溃。我该怎么做才能修复(或优化)它?

谢谢!

0 个答案:

没有答案