2017-01-07 44 views
1

我有一个超过100百万个文档的mongodb数据库。我想做聚合,所以我可以给文件统计。 我的文档的样子:庞大的数据集上的mongodb聚合

{ 
    "categ": "categ_4", 
    "code": 200, 
    "date": "01/01/2017", 
    "host": "www.myhost.com", 
    "hour": "19", 
    "http_ver": "HTTP/1.1", 
    "idate": 20170101, 
    "length": 21, 
    "protocol": "https", 
    "remote_ip": "111.22.333.44", 
    "resp_time": 0, 
    "time": "19:53:15", 
    "url": "my_url", 
} 
汇总时

,我在外壳进行这样的查询:

db.data.aggregate([{"$match": {"code":200}}, {"$group": {_id : "$code", total : {"$sum" : 1}}},{"$sort" : {_id: 1}}]) 

的问题是,它需要很长的时间来计算。这太慢了。有什么办法可以加快这个操作吗? 我tryed创建的“代码”字段,但没有成功

db.data.createIndex({code:1}) 

我能做些什么,使聚集更快指数?

谢谢

回答

2

好像您的查询是一样

db.data.count({"code":200}) 

你不需要为聚集。尝试简单的计数(与索引)

+0

我的查询是错误的(我不得不删除“$匹配”部分)。我想得到的是这样的: 'db.data.aggregate([{“$ group”:{_id:“$ code”,total:{“$ sum”:1}}},{“$排序“:{total:1}}]) {”_id“:404,”total“:11729} {”_id“:302,”total“:56068} {”_id“:410,总”:579872} { “_id”:304, “总”:8201025} { “_id”:301, “总”:1639247} { “_id”:200, “总”:82234244} ' –

+0

“尝试简单计数(** with index **)”是什么意思,是否有一种将索引添加到mongodb的有效方法?正如我上面所说的,我尝试了createIndex函数,但它似乎不影响聚合的工作方式。我不知道索引如何与mongodb协同工作,对吗? –

+0

@DanyM如果find/count/$ match查询可以使用索引,则使用它们而不是扫描集合中的每个文档(参见[索引手册](https://docs.mongodb.com/manual/indexes/)) 。如果您的聚合查询不是以$ match step开头的,那么它不会使用索引。 –