我正在使用以下查询来获取每天气温低于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
字段上使用索引。
您可能已经定义了索引,但没有使用它们。为了使聚合管道“使用”索引,$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“日期”对象构造函数。除非以正确的方式发布,否则您将获得本地转换的日期,而不是应该发布的UTC时间参考。在重新编写的清单中消除了这种和其他误解。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句