2017-01-07 3 views
1

У меня есть mongodb db с более чем 100 миллионами документов. Я хочу сделать агрегацию, чтобы я мог давать статистику по документам. мой документ выглядит следующим образом:mongodb aggregate на огромном наборе данных

{ 
    "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}}]) 

проблема заключается в том, что она занимает очень много времени, чтобы вычислить. это слишком медленно. есть ли способ ускорить эту операцию? я судимый создать индекс на поле «код», но без успеха

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

, что я могу сделать, чтобы сделать агрегацию быстрее?

спасибо

ответ

2

Похоже, ваш запрос так же, как

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

вам не нужна агрегация для этого. Попробуйте простой счет (с индексом)

+0

мой запрос был неправильным (мне пришлось удалить часть «$ match»). то, что я хочу получить, это примерно так: 'db.data.aggregate ([{" $ group ": {_id:" $ code ", total: {" $ sum ": 1}}}, {" $ сортировать ": {всего: 1}}]) {" _id ": 404," всего ": 11729} {" _id ": 302," total ": 56068} {" _id ": 410," общее»: 579872} { "_id": 304, "всего": 8201025} { "_id": 301, "всего": 1639247} { "_id": 200, "всего": 82234244} ' –

+0

что вы подразумеваете под «Попробуйте простой подсчет (** с индексом **)», есть ли эффективный способ добавления индексов в mongodb? как я сказал выше, я попробовал функцию createIndex, но, похоже, это не влияет на работу агрегации. Я не знаю, как индексы работают с mongodb, не так ли? –

+0

@DanyM, если запрос find/count/$ match может использовать индексы, то он использует их вместо сканирования каждого документа в коллекции (см. [Руководство по указателям] (https://docs.mongodb.com/manual/indexes/)) , Если ваш запрос агрегации не начинается с $ match step, то он не будет использовать индексы. –

Смежные вопросы