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

如何提高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

我使用下面的查询来获取每天气温低于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
字段上使用索引。

您可能已经定义了索引,但没有使用它们。为了使聚合管道“使用”索引,必须首先实现该阶段。此外,如果你完全忽略了这个,只是把它包括在你做的最有效的方式

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你总可以问另一个问题。但是这里的暗示我