Mongodb mongo中的慢速数据聚合查询
我有一个包含700万个文档的mongo集合,除了几个其他字段外,每个文档都有一个“createdAt”日期对象。我在字段上有一个索引“createdAt:1”,它托管在一个专用的mongo服务上 当我尝试按天分组时,查询变得非常慢。以下是我的聚合查询:Mongodb mongo中的慢速数据聚合查询,mongodb,mongoose,Mongodb,Mongoose,我有一个包含700万个文档的mongo集合,除了几个其他字段外,每个文档都有一个“createdAt”日期对象。我在字段上有一个索引“createdAt:1”,它托管在一个专用的mongo服务上 当我尝试按天分组时,查询变得非常慢。以下是我的聚合查询: { "$match": { "createdAt": { $gte:new Date(1472189560111) } } }, { "$project": {
{
"$match": {
"createdAt": {
$gte:new Date(1472189560111)
}
}
},
{
"$project": {
"date":
{
"$dateToString": {
"format": "%Y-%m-%d",
"date": "$createdAt"
}
},
"count": 1
}
},
{
"$group": {
"_id": "$date",
"count": {
"$sum": 1
}
}
},
{
"$sort": {
"_id": 1
}
},
{
"$project": {
"date": "$_id",
"count": 1,
"_id": 0
}
}
提高绩效的好策略是什么?我的聚合管道中是否存在问题?我是否需要一个包含day date对象的字段,该对象具有固定的时间(如00:00)和组?这似乎是一个基本的操作,我相信必须有一个mongodb本机方法来完成。在
createdAt
字段上是否有索引?这将大大提高性能。另外,不要使用单独的$project
阶段,因为这会有效地传递所有匹配的数据并重写字段。而是直接在$group
中执行$dateToString
,它将在执行时压缩。更好的是,不要使用字符串,而是使用。使用更少的空间。这就是为什么首先要使用日期
对象而不是字符串。另外,在管道的末尾添加无用的$project
。所有的新手都犯了错误。事实上,项目阶段的速度要快得多,实际上毫无用处。你还有什么改进建议吗?我确实有一个索引。这和你得到的一样优化。您仍然没有确认是否存在索引。它是?所以要做的两件事是1。使用索引进行选择。2.不要包含不必要的额外处理。在那之后,一切都是关于“结果的大小”,如果有很多事情需要“处理”,那么这需要一些时间。于是就出现了“硬件”问题。太好了,我有一个索引。