我们假设我们有一组文档,其中每个文档代表一个这样的网络子网:
{'network':'10.0.0.0/24,'someattr':'aaa'}
{'network':'192.168.0.0/16','someattr':'bbb'}
{'network':'172.16.0.0/16','someattr':'ccc'}
有什么方法可以在MongoDB集合中查找单个IP地址(例如' 10.0.100.50')并识别它所属的子网/文档?
答案 0 :(得分:7)
请记住,IP仅为int
,子网掩码只是int
s的范围 - 它们按原样显示,以便人们可以读取它们(以及其他原因)。我要做的是在我的MongoDB架构中添加两个额外的字段:startAddr
和endAddr
。将它们表示为int
,它们将是您子网的起始和结束地址。
接下来,您可以将IP转换为应用程序中的int
。有关将IP转换为整数的信息,请参阅here,您没有提到您正在编写应用程序的语言,因此无法帮助您。
最后,通过以下
查询MongoDBdb.collection.find({startAddr: {$lte: <ip>}, {endAddr: {$gte: <ip>}}})
您还可以将此新架构与某些应用程序级别代码结合使用,以便在需要时轻松执行查找具有重叠子网的文档等内容。