MongoDB慢聚合时间

Posted

技术标签:

【中文标题】MongoDB慢聚合时间【英文标题】:MongoDB slow aggregate time 【发布时间】:2017-05-17 20:34:50 【问题描述】:

我遇到了一个问题,即聚合函数执行速度非常慢,大约需要 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秒。我已经在“位置”和“日期”上执行了 ensureIndex()。随着返回的记录数量增加,这应该是正常的吗?如果它不正常,我是否可以知道是否有一种解决方法可以将我的查询时间减少到最大 5 秒而不是 28 秒或更长时间?提前致谢!提供的任何解决方案都非常感谢!

【问题讨论】:

【参考方案1】:

Date 上的索引很可能没有被使用。

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

建议:

    将 $match 阶段移到管道的开头 “位置”、“日期”和“链接”字段不是数组,因此尚不清楚为什么这些字段上有 $unwind 聚合阶段。您可能需要删除这些。

【讨论】:

以上是关于MongoDB慢聚合时间的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 MongoDB 聚合查询这么慢

MongoDB 获取总数,因为使用聚合的结果非常慢

[MongoDB]Profiling性能分析

MongoDB数据update的坑

MongoDB、时间序列和聚合框架

MongoDB聚合时间序列