如何提高MongoDB聚合查询的性能?

时间:2014-08-13 08:55:22

标签: mongodb performance mongodb-query aggregation-framework

我使用以下查询来获取每天的气温低于7.2度的记录数。文档建议使用聚合框架,因为它比map reduce

更快
db.maxial.aggregate([{
    $project: {
        time:1,
        temp:1,
        frio: {
            $cond: [
                { $lte: [ "$temp", 7.2 ] },
                0.25,
                0
            ]
        }
    }
}, {
    $match: {
        time: {
            $gte: new Date('11/01/2011'),
            $lt: new Date('11/03/2011')
        }
    }
}, {
    $group: {
        _id: {
            ord_date: {
                day: { $dayOfMonth: "$time" },
                month: { $month: "$time" },
                year: { $year: "$time" }
            }
        },
        horasFrio: { $sum: '$frio' }
    }
}, {
    $sort: {
        '_id.ord_date': 1
    }
}])

我的平均执行时间为2秒。难道我做错了什么?我已在timetemp字段使用索引。

2 个答案:

答案 0 :(得分:2)

您可能已定义索引但未使用它们。为了使聚合管道“使用”索引,必须首先实现$match阶段。此外,如果您完全省略$project并将其包含在$group中,那么您将以最有效的方式进行此操作。

db.maxial.aggregate( [
    { "$match": {
        "time": {
            "$gte": new Date('2011-11-01'),
            "$lt": new Date('2011-11-03')
        }
    }},
    { "$group": {
        "_id": {
           "day": { "$dayOfMonth": "$time" },
           "month": { "$month": "$time" },
           "year": { "$year": "$time" }
       },
       "horasFrio": {
          "$sum": { 
              "$cond": [{ "$lte": [ "$temp", 7.2 ] }, 0.25, 0 ]
          }
       }
    }},
    { "$sort": { "_id": 1} }
])

项目没有提供人们认为在直接“减少领域”方面所做的好处。

并注意JavaScript“Date”对象构造函数。除非您以正确的方式发布,否则您将获得本地转换的日期,而不是您应该发布的UTC时间参考。在重写的清单中清除了这一点和其他误解。

答案 1 :(得分:-1)

要提高聚合查询的性能,您必须使用各种管道阶段,并以正确的顺序使用。 您可以先使用 $ match ,然后再使用 $ limit $ skip (如果需要)。这些都将缩短要遍历以进行分组的记录的数量,从而提高性能。