У меня есть 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})
, что я могу сделать, чтобы сделать агрегацию быстрее?
спасибо
мой запрос был неправильным (мне пришлось удалить часть «$ 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} ' –
что вы подразумеваете под «Попробуйте простой подсчет (** с индексом **)», есть ли эффективный способ добавления индексов в mongodb? как я сказал выше, я попробовал функцию createIndex, но, похоже, это не влияет на работу агрегации. Я не знаю, как индексы работают с mongodb, не так ли? –
@DanyM, если запрос find/count/$ match может использовать индексы, то он использует их вместо сканирования каждого документа в коллекции (см. [Руководство по указателям] (https://docs.mongodb.com/manual/indexes/)) , Если ваш запрос агрегации не начинается с $ match step, то он не будет использовать индексы. –