我使用以下查询来获取每天的气温低于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秒。难道我做错了什么?我已在time
和temp
字段使用索引。
答案 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 (如果需要)。这些都将缩短要遍历以进行分组的记录的数量,从而提高性能。