如何提高MongoDB聚合查询的性能?
我使用下面的查询来获取每天气温低于7.2度的记录数。文档建议使用聚合框架,因为它比map-reduce更快如何提高MongoDB聚合查询的性能?,mongodb,performance,mongodb-query,aggregation-framework,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
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
字段上使用索引。您可能已经定义了索引,但没有使用它们。为了使聚合管道“使用”索引,必须首先实现该阶段。此外,如果你完全忽略了这个,只是把它包括在你做的最有效的方式
db.maxial.aggregate([
{“$match”:{
“时间”:{
“$gte”:新日期('2011-11-01'),
“$lt”:新日期('2011-11-03')
}
}},
{“$组”:{
“_id”:{
“日”:{“$dayOfMonth”:“$time”},
“月”:{“$month”:“$time”},
“年”:{“$year”:“$time”}
},
“霍拉斯弗里奥”:{
“$sum”:{
“$cond”:[{“$lte”:[“$temp”,7.2]},0.25,0]
}
}
}},
{“$sort”:{“\u id”:1}
])
该项目并没有提供人们认为的直接“减少领域”的好处
注意JavaScript“日期”对象构造函数。除非您以正确的方式发布,否则您将获得本地转换的日期,而不是您应该发布的UTC时间参考。在重新编写的列表中,这一点和其他误解都被澄清了。您可能已经定义了索引,但没有使用它们。为了使聚合管道“使用”索引,必须首先实现该阶段。此外,如果你完全忽略了这个,只是把它包括在你做的最有效的方式
db.maxial.aggregate([
{“$match”:{
“时间”:{
“$gte”:新日期('2011-11-01'),
“$lt”:新日期('2011-11-03')
}
}},
{“$组”:{
“_id”:{
“日”:{“$dayOfMonth”:“$time”},
“月”:{“$month”:“$time”},
“年”:{“$year”:“$time”}
},
“霍拉斯弗里奥”:{
“$sum”:{
“$cond”:[{“$lte”:[“$temp”,7.2]},0.25,0]
}
}
}},
{“$sort”:{“\u id”:1}
])
该项目并没有提供人们认为的直接“减少领域”的好处
注意JavaScript“日期”对象构造函数。除非您以正确的方式发布,否则您将获得本地转换的日期,而不是您应该发布的UTC时间参考。在重新编写的列表中,这一点和其他错误概念都被清除了。要提高聚合查询的性能,您必须以正确的顺序使用各种管道阶段。
您可以先使用$match,然后根据需要使用$limit和$skip。所有这些都将缩短分组时要遍历的记录数,从而提高性能。要提高聚合查询的性能,您必须使用不同的管道阶段并按正确的顺序进行操作。
您可以先使用$match,然后根据需要使用$limit和$skip。所有这些都将缩短分组需要遍历的记录数,从而提高性能。我怀疑MongoDB是否在这里使用您的索引。尝试切换
$match
和$project
块,以确保使用时间
索引。如果希望MongoDB有效使用temp
索引,请将temp:{$lte:7.2}
检查添加到$match
块。此外,为什么要$sum
零值?这是个好问题。问题是,当一天没有任何符合条件的文档时,我需要获取0
。我怀疑MongoDB是否在这里使用您的索引。尝试切换$match
和$project
块,以确保使用时间
索引。如果希望MongoDB有效使用temp
索引,请将temp:{$lte:7.2}
检查添加到$match
块。此外,为什么要$sum
零值?这是个好问题。问题是,当一天没有任何符合条件的文档时,我需要获取0
。我在数据库中使用date
类型字段。我是否有另一种(更有效的)方法来进行$match
?@Hugo Date是这种类型最有效的存储,我只是告诉您要注意如何实例化。并非所有表单都生成UTC时间。有人评论说,您还可以在“temp”上复合索引。“后填充”零值比尝试在响应中“暴力”零值更好。对索引进行查询筛选的好处通常大于后期处理的成本。顺便说一下,$sort
仅在每月的某一天起作用。它目前不起作用。你能帮我吗?@Hugo你总可以问另一个问题。但这里的提示是不要根据“_id”排序,而是根据子文档的各个属性排序。我在数据库中使用了date
type字段。我是否有另一种(更有效的)方法来进行$match
?@Hugo Date是这种类型最有效的存储,我只是告诉您要注意如何实例化。并非所有表单都生成UTC时间。有人评论说,您还可以在“temp”上复合索引。“后填充”零值比尝试在响应中“暴力”零值更好。对索引进行查询筛选的好处通常大于后期处理的成本。顺便说一下,$sort
仅在每月的某一天起作用。它目前不起作用。你能帮我吗?@Hugo你总可以问另一个问题。但是这里的暗示我