Guardo el acceso de registro en MongoDB como
{ "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" }Quiero consultar con una salida para el acceso de IP de resumen como
{ "_id":"10.10.10.0", "count":2, "_id":"10.10.20.0", "count":1, "_id":"10.20.10.0", "count":1, }¿Cómo hago esto?
Si asumimos que el nombre de la colección es ips y la propiedad "CustomField" siempre se representa como "X-FORWARDED-FROM THE_IP_ADDRESS" , la siguiente consulta agregada da el resultado deseado:
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 } }])Hace la siguiente agregación:
_id como última parte de la dirección IPSi la cadena X-FORWARDED-FROM se corrige para cada CustomField , entonces se puede resolver usando $substr .
db.CollectionName.aggregate([ {$group:{ _id:"$CustomField", count:{$sum:1} } }, {$project:{ _id: { $substr: [ "$_id", 17, -1] }, count:1 } } ])donde 17 significa empezar desde. esa es la longitud de la cadena X-FORWARDED-FROM
Actualizado:
db.CollectionName.aggregate([ {$project:{ ip: {$concat: [{ $substr: [ "$CustomField", 17,8] },'.0']} } }, {$group:{ _id:"$ip", count:{$sum:1} } } ])para MongoDB 3.4 puede usar
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} } } ])