Mongodb 聚合查询花费的时间太长
我在最新版本的MongoDB中使用聚合框架进行了查询。问题是,我找不到获得结果的方法,因为这需要太长时间,而且过程崩溃 收藏 Constructora包含50000份文档(包括嵌入式文档等) 变量包含400.000个文档,包括嵌入文档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,
{
_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
语句(当然代价高昂)之外,“连接”的数据驻留在一个数组中。这意味着返回的不是“匹配的数组元素”,而是包含任何匹配数组元素的“整个”“变量”
文档。作为第一步,您“应该”删除任何不匹配的数组元素。