2017-01-26 2 views
2

ich Zugang in MongoDB wieGruppe von IP Klasse

speichern log
{ 
    "Host": "www.foo.com" 
    "CustomField":"X-FORWARDED-FROM 10.10.10.10" 
},{ 
    "Host": "www.foo.com" 
    "CustomField":"X-FORWARDED-FROM 10.20.10.192" 
},{ 
    "Host": "www.foo.com" 
    "CustomField":"X-FORWARDED-FROM 10.10.20.159" 
},{ 
    "Host": "www.foo.com" 
    "CustomField":"X-FORWARDED-FROM 10.10.10.150" 
} 

Ich möchte mit einem Ausgang für Zusammenfassung ip Zugang zur Abfrage wie

{ 
    "_id":"10.10.10.0", "count":2, 
    "_id":"10.10.20.0", "count":1, 
    "_id":"10.20.10.0", "count":1, 
} 

Wie kann ich über diese gehen?

+0

verwenden können, ist 'X-forwarded-FROM' feste für jedes 'CustomField'? –

+0

X-forwarded-FROM befestigt ist. –

+0

kann meine Antwort –

Antwort

1

Wenn wir davon ausgehen, dass die Sammlung Namen ips und die "CustomField" Eigenschaft ist immer als "X-FORWARDED-FROM THE_IP_ADDRESS" dargestellt wird, dann gibt die folgende Abfrage-Aggregation das gewünschte Ergebnis:

db.ips.aggregate([{ 
    $project:{ 
     _id:{ 
      $substr:["$CustomField", 17, -1] 
     } 
    }, 
},{ 
    $project: { 
     ip: {$split:["$_id", "."]} 
    }, 
},{ 
    $project: { 
     ip: {$slice:["$ip", 3]} 
    }, 
}, { 
    $project: { 
     ip: { 
     $reduce: { 
      input: "$ip", 
      initialValue: "", 
      in: { $concat : ["$$value", "$$this", "."] } 
     } 
     } 
    } 
}, { 
    $group:{ 
     _id: "$ip", count:{$sum:1} 
    } 
}, { 
    $project: { 
     _id:{$concat:["$_id", "0"]}, 
     count: 1 
    } 
}]) 

Es führt folgende Aggregation:

  1. nimmt IP-Adresse aus dem String
  2. Splits die Zeichenfolge in Arrays von 4 Teilen IP-Adresse
  3. Entfernt den letzten Teil von dem Array
  4. Verkettet Array-Elemente in einen String
  5. gruppiert sie der IP-Adresse
  6. verkettet schließlich „0“ an das _id Feld als letzten Teil der IP-Adresse
+0

Danke. Deine Lösung ist Arbeit. aber das Ergebnis ist keine Gruppe nach IP-Klasse. Es ist '{ " _id ":" 10.10.10.10 "," zählen ": 1, " _id ":" 10.20.10.192 "," zählen ": 1, " _id ":" 10.10.20.159 ", „count“: 1, „_id“: „10.10.10.150“, „rechnen“: 1, } ' –

+0

zuerst muß mich falsch Ihre Frage, weil es wenig verwirrend im Zusammenhang mit dem letzten Teil der war IP Adresse. Allerdings habe ich meine Antwort aktualisiert, jetzt gibt es die gewünschte Ausgabe. – Karlen

+0

vielen Dank. Es funktioniert. –

0

Wenn X-forwarded-FROM Schnur befestigt ist für jeden CustomField dann unter Verwendung $substr lösen können.

db.CollectionName.aggregate([ 
    {$group:{ 
     _id:"$CustomField", 
     count:{$sum:1} 
     } 
    }, 
    {$project:{ 
     _id: { $substr: [ "$_id", 17, -1] }, 
     count:1 
     } 
    } 
]) 

wo Mittel aus starten. das ist die Länge von X-forwarded-FROM String

Aktualisiert:

db.CollectionName.aggregate([ 
    {$project:{ 
     ip: {$concat: [{ $substr: [ "$CustomField", 17,8] },'.0']} 
     } 
    }, 
    {$group:{ 
     _id:"$ip", 
     count:{$sum:1} 
     } 
    } 
]) 

für MongoDB 3,4

db.CollectionName..aggregate([ 
    {$project:{ 
     ip:{ $split: [ { $substr: [ "$CustomField", 17,-1] }, "." ] }//ip: ["10","10","10","192"] 
     } 
    }, 
    {$project:{ 
     ip:{ $concat: [ 
      { $arrayElemAt: [ "$ip", 0 ] }, 
      " . ", 
      { $arrayElemAt: [ "$ip", 1 ] }, 
      ".", 
      { $arrayElemAt: [ "$ip", 2 ] }, 
      ".0" 
      ] } 
     }, 
    }, 
    {$group:{ 
     _id:"$ip", 
     count:{$sum:1} 
     } 
    } 
]) 
+0

Danke. Deine Lösung ist Arbeit. aber das Ergebnis ist keine Gruppe nach IP-Klasse. Es ist '{ " _id ":" 10.10.10.10 "," zählen ": 1, " _id ":" 10.20.10.192 "," zählen ": 1, " _id ":" 10.10.20.159 ", "count": 1, "_id": "10.10.10.150 "," count ": 1, }' –

+0

was meinst du mit IP-Klasse ersten drei Teil? @WatcharaKangkun –

+0

IP-Klasse ist meine erste drei Teil der IP-Adresse wie 10.10.10.10 und 10.10.10.150 ist die gleiche IP Klasse –