Mongodb mongo中的慢速数据聚合查询

Mongodb mongo中的慢速数据聚合查询,mongodb,mongoose,Mongodb,Mongoose,我有一个包含700万个文档的mongo集合,除了几个其他字段外,每个文档都有一个“createdAt”日期对象。我在字段上有一个索引“createdAt:1”,它托管在一个专用的mongo服务上 当我尝试按天分组时,查询变得非常慢。以下是我的聚合查询: { "$match": { "createdAt": { $gte:new Date(1472189560111) } } }, { "$project": {

我有一个包含700万个文档的mongo集合,除了几个其他字段外,每个文档都有一个“createdAt”日期对象。我在字段上有一个索引“createdAt:1”,它托管在一个专用的mongo服务上

当我尝试按天分组时,查询变得非常慢。以下是我的聚合查询:

{
    "$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.不要包含不必要的额外处理。在那之后,一切都是关于“结果的大小”,如果有很多事情需要“处理”,那么这需要一些时间。于是就出现了“硬件”问题。太好了,我有一个索引。