查找阶段之后的Mongodb聚合管道性能问题

时间:2020-04-24 09:40:54

标签: mongodb mongodb-query aggregation-framework

我试图对庞大的数据集运行查询,但是在查找阶段(第3阶段)之后,它花费了太多时间(大约12小时)。如何提高查询性能。我在mongodb 4.0版本中使用16 cpu,64 gb RAM的单节点。

// Pipeline
[
    // Stage 1
    {
        $match: {
         "ID" : "XXXXX"
        }
    },

    // Stage 2
    {
        $redact: {
           $cond: [ { $or: [ { $eq: [ "$Masterid", "" ] }, { $or: [ { $eq: [ "$VKORG", "" ] }, { $or: [ { $eq: [ "$VTWEG", "" ] },{ $eq: [ "$UDATE", "" ] } ] } ] } ] } ] } ] } ] } ] }, "$$PRUNE", "$$KEEP" ] 
        }
    },

    // Stage 3
    {
        $lookup: {
            from: "BU07-02", let: { raw_Masterid: "$Masterid", raw_VKORG: "$VKORG", raw_VTWEG: "$VTWEG", raw_SPART: "$SPART", raw_KUNNR: "$KUNNR",
               raw_VBELN: "$VBELN", raw_POSNR: "$POSNR", raw_UDATE: "$UDATE", raw_KNUMH: "$KNUMH", raw_AUART: "$AUART", raw_FKART: "$FKART",
                }, pipeline: [ { $match: { $expr: { $and: [ { $eq: [ "$$raw_Masterid", "$Masterid" ] }, 
                  { $and: [ { $eq: [ "$$raw_VKORG", "$VKORG" ] }, { $and: [ { $eq: [ "$$raw_VTWEG", "$VTWEG" ] }, { $and: [ { $eq: [ "$$raw_SPART", "$SPART" ] },
                     { $and: [ { $eq: [ "$$raw_KUNNR", "$KUNNR" ] }, { $and: [ { $eq: [ "$$raw_VBELN", "$AUBEL" ] }, { $and: [ { $eq: [ "$$raw_POSNR", "$AUPOS" ] }, 
                       { $lte: [ "$$raw_UDATE", "$UDATE" ] } ] } ] } ] } ] } ] } ] } ] } } } ], as: "BU07-02"
        }
    },

    // Stage 4
    {
        $unwind: {
            path : "$BU07-02",

        }
    },

    // Stage 5
    {
        $redact: {
        $cond: [ { $and: [ { $eq: [ "$Masterid", "$BU07-02.Masterid" ] }, { $and: [ { $eq: [ "$VKORG", "$BU07-02.VKORG" ] }, { $and: [ { $eq:
           [ "$VTWEG", "$BU07-02.VTWEG" ] }, { $and: [ { $eq: [ "$SPART", "$BU07-02.SPART" ] }, { $and: [ { $eq: [ "$KUNNR", "$BU07-02.KUNNR" ] }, 

                     { $and: [ { $ne: [ "$BU07-02.FKART", "ZBS1" ] },
                              { $and: [ { $ne: [ "$BU07-02.FKART", "ZBS2" ] }, { $and: [ { $ne: [ "$VBTYP", "U" ] }, { $and: [ { $ne: [ "$BU07-02.VBTYP", "U" ] }, 
                                { $ne: [ "$BASE_ENTITY", true ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] } ] }, "$$KEEP", 
                                "$$PRUNE" ] }
    },      
],

);

1 个答案:

答案 0 :(得分:0)

$lookup的流水线形式和$expr运算符都不能有效地使用索引。这意味着$lookup阶段实际上是从磁盘读取BU07-02集合中的每个文档,以便评估所有条件。

您可以尝试选择期望的标准,这些条件通常将返回最少的文档,并以foreignField的{​​{1}}形式使用它,并确保{{1 }},然后使用$lookupBU07-02来应用其余条件。