MongoDB查询ip范围

本文关键字:范围 ip 查询 MongoDB | 更新日期: 2023-09-27 18:07:17

我正在开发一个IP认证服务,我正在寻找一种合适的方法来存储mongoDB中的IP范围,以便以后检查IP是否在一个范围内。基本上我有三个想法:

  • 存储为字符串{from;to},然后创建一个js函数来执行ip检查,然后在find中使用它;
  • 存储为字节,然后创建一个js函数来做检查。
  • 存储为字符串,并在c#中使用,而不是在Mongo中执行ip匹配。

是否有其他的解决方案将比我提到的性能更高?

MongoDB查询ip范围

因为这个问题还没有一个完整的答案,我决定把它贴在这里。

将范围的起始和结束IP地址保存为整数,查询时使用$lte$gte MongoDB操作符查找匹配。此外,在startend字段上创建索引,这样即使要搜索的文档数量更大,性能也会很好。

让我们执行一个示例,其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,则startend字段都需要具有相同的值。

{ "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 },
})