2017-01-07 87 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開頭的,那麼它不會使用索引。 –