我在 MongoDB 中保存日志访问,如
{
"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"
}
我想查询摘要 ip 访问的输出,例如
{
"_id":"10.10.10.0", "count":2,
"_id":"10.10.20.0", "count":1,
"_id":"10.20.10.0", "count":1,
}
我该怎么做?
最佳答案
如果我们假设集合名称是 ips
并且 "CustomField"
属性始终表示为 "X-FORWARDED-FROM THE_IP_ADDRESS"
,那么下面的查询聚合给出了期望的结果:
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
}
}])
它进行以下聚合:
- 从字符串中获取IP地址
- 将字符串拆分为由 IP 地址的 4 部分组成的数组
- 从数组中删除最后一部分
- 将数组元素连接成一个字符串
- 按 IP 地址分组
- 最后将“0”连接到
_id
字段作为 IP 地址的最后一部分
关于mongodb - 按 IP 类别分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41868711/