MongoDB查询ip范围
本文关键字:范围 ip 查询 MongoDB | 更新日期: 2023-09-27 18:07:17
我正在开发一个IP认证服务,我正在寻找一种合适的方法来存储mongoDB中的IP范围,以便以后检查IP是否在一个范围内。基本上我有三个想法:
- 存储为字符串
{from;to}
,然后创建一个js函数来执行ip检查,然后在find中使用它; - 存储为字节,然后创建一个js函数来做检查。
- 存储为字符串,并在c#中使用,而不是在Mongo中执行ip匹配。
是否有其他的解决方案将比我提到的性能更高?
因为这个问题还没有一个完整的答案,我决定把它贴在这里。
将范围的起始和结束IP地址保存为整数,查询时使用$lte
和$gte
MongoDB操作符查找匹配。此外,在start
和end
字段上创建索引,这样即使要搜索的文档数量更大,性能也会很好。
让我们执行一个示例,其IP范围以2.0.0.0
开始,以8.255.255.255
结束。两个IP地址将被测试:a) 4.5.6.7
, b) 60.70.80.90
:
需要将所有ip转换为整数
- Range start
2.0.0.0
=33554432
- Range end
8.255.255.255
=150994943
-
4.5.6.7
=67438087
-
60.70.80.90
=1011241050
为了在数据库中存储IP范围,你可以创建一个MongoDB文档,就像下面这段一样。如果您只希望获取一个IP,则start
和end
字段都需要具有相同的值。
{ "start": 33554432, "end": 150994943 }
然后使用$lte
和$gte
运算符执行查找查询,将获得要测试的IP的整数值。
// this will result in one match because 67438087 = 4.5.6.7
db.collection.find({
start: { $lte: 67438087 },
end: { $gte: 67438087 },
})
// this will end up with no result because 1011241050 = 60.70.80.90
db.collection.find({
start: { $lte: 1011241050 },
end: { $gte: 1011241050 },
})