2017-01-07 4 views
1

Ich habe eine Mongodb db mit mehr als 100 Millionen Dokumente. ich möchte Aggregation machen, damit ich Statistiken über Dokumente geben kann. mein Dokument wie folgt aussehen:mongodb Aggregat auf riesigen Datenmenge

{ 
    "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", 
} 

wenn aggregieren, i führen Sie eine Abfrage wie dies in meinem Shell:

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

das Problem ist, dass es eine sehr lange Zeit zu berechnen dauert. Das ist zu langsam. Gibt es eine Möglichkeit, diesen Vorgang zu beschleunigen? i tryed Index auf "Code" Feld zu schaffen, aber ohne Erfolg

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

was kann ich Aggregation schneller tun?

danke

Antwort

2

Scheint, wie Ihre Anfrage gleiche ist wie

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

Sie Aggregation brauchen nicht dafür. Versuchen Sie einfache Zählung (mit Index)

+0

meine Abfrage war falsch (ich musste den "$ match" -Teil entfernen). Was ich bekommen möchte, ist etwa so: 'db.data.aggregate ([{" $ group ": {_id:" $ code ", total: {" $ sum ": 1}}}, {" $ Sortieren ": {insgesamt wurden 1}}]) { "_id": 404, "total": 11729} { "_id": 302, "total": 56068} { "_id": 410" total“: 579.872} { "_id": 304, "total": 8.201.025} { "_id": 301, "total": 1.639.247} { "_id" 200, "total": 82.234.244} ' –

+0

Was meinst du mit "Einfaches Zählen versuchen (** mit Index **)", gibt es eine effiziente Möglichkeit, Indizes zu Mongodb hinzuzufügen? Wie ich oben gesagt habe, habe ich die CreateIndex-Funktion versucht, aber es scheint nicht zu beeinflussen, wie Aggregation funktioniert. Ich weiß nicht, wie Indizes mit mongodb funktionieren, oder? –

+0

@DanyM Wenn die Abfrage "find/count/$ match" Indizes verwenden kann, verwendet sie sie, anstatt jedes Dokument in der Sammlung zu scannen (siehe [Indexes Handbuch] (https://docs.mongodb.com/manual/indexes/)) . Wenn Ihre Aggregationsabfrage nicht mit dem $ match-Schritt beginnt, verwendet sie keine Indizes. –