Mongodb聚合花费超过15秒

时间:2017-06-27 11:27:19

标签: mongodb aggregation-framework

我的收藏中有超过100k的记录,并且每5秒钟它会在收集中添加一条记录。我有一个汇总查询,可以从最近一年的数据中获得720(大约)记录。

汇总查询:

db.collectionName.aggregate([
    {"$match": {
        "Id": "****-id-****",
        "receivedDate": {
            "$gte": ISODate("2016-06-26T18:30:00.463Z"), 
            "$lt": ISODate("2017-06-26T18:30:00.463Z")
        }
    }
    },
    {"$group": {
        "_id": {
            "$add": [
                {"$subtract": [
                    {"$subtract": ["$receivedDate", ISODate("1970-01-01T00:00:00.000Z")]},
                    {"$mod": [
                        {"$subtract": ["$receivedDate", ISODate("1970-01-01T00:00:00.000Z")]},
                    43200000
                    ]}
                ]},
                    ISODate("1970-01-01T00:00:00.000Z")
            ]
        }, 
        "_rid": {"$first": "$_id"}, 
        "_data": {"$first": "$receivedData.data"}, 
        "count": {"$sum": 1}
    }
    },
    {"$sort": {"_id": -1}},
    {"$project": {
        "_id": "$_rid", 
        "receivedDate": "$_id", 
        "receivedData": {"data": "$_data"}
    }
    }
])

我不确定为什么它花了超过15秒,当我试图获取1个月的数据时它工作正常。

1 个答案:

答案 0 :(得分:0)

现在回答这个问题为时已晚,这对其他人有帮助,

在这种情况下,Distribution 可能会有所帮助,复合索引可以支持匹配多个字段的查询。

您可以在 IdreceivedDate 字段上创建复合索引,

db.collectionName.createIndex({ Id: -1, receivedDate: -1 });

复合索引中列出的字段的顺序很重要。该索引将包含对首先按 Id 字段的值排序的文档的引用,然后在 Id 字段的每个值内,按 receivedDate 字段的值排序。