mongodb - 按 IP 类别分组

标签 mongodb mongodb-query aggregation-framework

我在 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
    }
}])  

它进行以下聚合:

  1. 从字符串中获取IP地址
  2. 将字符串拆分为由 IP 地址的 4 部分组成的数组
  3. 从数组中删除最后一部分
  4. 将数组元素连接成一个字符串
  5. 按 IP 地址分组
  6. 最后将“0”连接到 _id 字段作为 IP 地址的最后一部分

关于mongodb - 按 IP 类别分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41868711/

相关文章:

arrays - 索引嵌入文档的键到底意味着什么?

java.net.SocketException : No buffer space available (maximum connections reached? ): 连接 MongoDB JAVA API 驱动程序

mongodb - 如果日期在 mongodb 中为字符串格式,则使用 $gte 和 &lte mongo 运算符

mongodb - Morphia 在性能方面 fetch 和 asList 之间有区别吗

Mongodb:如何使用一个查询获取不同集合中文档的数量?

java - Spring Boot 1.5.1、Spring Data MongoDB 没有用于存储库的合格 bean

javascript - 使用 MongoDB map-reduce 生成扁平化文档

javascript - 为什么这个 RegExp 查询返回所有结果?

mongodb - 汇总匹配 true 的字段数

javascript - MongoDB 删除重复的子文档