MongoDB缓慢的聚合时间

时间:2017-05-17 20:34:51

标签: mongodb mongodb-query query-optimization aggregation-framework

我遇到的问题是聚合函数执行速度非常慢,需要大约30秒来收集所有数据。假设此结构中的1条记录:

{
    "_id":{
        "$oid":"5909a5cefece40f172895a6b"
    },
    "Record":1,
    "Link":"https://www.google.com",
    "Location":["loc1", "loc2", "loc3"],
    "Organization":["org1", "org2", "org3"],
    "Date":2017,
    "PeoplePPL":["ppl1", "ppl2", "ppl3"]
}

汇总查询如下:

db.testdata_4.aggregate([{
    "$unwind": "$PeoplePPL"
},{
    "$unwind": "$Location"  
},{
    "$match": {
        Date: {
            $gte: lowerBoundYear,
            $lte: upperBoundYear
        }
    }
},{
    "$group": {
        "_id": {
            "People": "$PeoplePPL",
            "Date": "$Date"
        },
        Links: {
            $addToSet: "$Link"
        },
        Locations: {
            $addToSet: "$Location"
        }
    }
},{
    "$group": {
        "_id": "$_id.People",
        Record: {
            $push: {
                "Country": "$Locations",
                "Year": "$_id.Date",
                "Links": "$Links"
            }
        }
    }
}]).toArray()

“testdata_4”集合中总共有154条记录,在聚合时,将返回5571条记录,查询时间为28秒。我在“Locations”和“Date”上执行了ensureIndex()。当返回的记录数增加时,这应该是正常的吗?如果不正常,我是否可以知道是否有一种解决方法可以将查询时间减少到最多5秒而不是28秒或更长时间?提前致谢!非常感谢提供任何解决方案!

1 个答案:

答案 0 :(得分:0)

$today = date("m/d/Y"); 上的索引很可能没有被使用。

Date$match运算符在使用时可以利用索引at the beginning of the pipeline。在这种情况下,过滤器在几个$展开阶段之后应用,这意味着它可能不会被使用。

建议:

  1. 将$ match阶段移至管道的开头
  2. "位置","日期"和"链接"字段不是数组,因此不能立即清楚为什么在这些字段上有$ unwind聚合阶段。您可能想要删除这些。