MongoDB查询ip范围

Geo*_*scu 5 javascript c# ip mongodb

我正在开发一个 IP 身份验证服务,并且正在寻找一种在 mongoDB 中存储 ip 范围的正确方法,以便稍后检查 ip 是否在某个范围内。基本上我有3个想法:

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

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

Jan*_*bík 1

因为这个问题还没有完整的答案,所以我决定在这里发布。

\n

将范围的起始和结束 IP 地址存储为整数,并在查询时使用$lte$gteMongoDB 运算符来查找匹配项。此外,在startend字段上创建索引,这样即使需要搜索大量文档,性能也很好。

\n

让我们用一个以 开头2.0.0.0和结尾的IP 范围来执行一个示例8.255.255.255。将测试两个 IP 地址: a)\xc2\xa0 4.5.6.7、 b) 60.70.80.90

\n

您需要将所有 IP 转换为整数

\n
    \n
  • 范围起始2.0.0.0=33554432
  • \n
  • 范围结束8.255.255.255=150994943
  • \n
  • 测试IP a 4.5.6.7=67438087
  • \n
  • 测试 IP b 60.70.80.90=1011241050
  • \n
\n

为了将 IP 范围存储在数据库中,您可以创建一个 MongoDB 文档,如本段下面的文档。如果您只想登记一个 IP,则startend字段都需要具有相同的值。

\n
{ "start": 33554432, "end": 150994943 }\n
Run Code Online (Sandbox Code Playgroud)\n

$lte然后使用和运算符执行查找查询$gte ,这将获取要测试的 IP 的整数值。

\n
// this will result in one match because 67438087 = 4.5.6.7\ndb.collection.find({\n    start: { $lte: 67438087 },\n    end: { $gte: 67438087 },\n})\n
Run Code Online (Sandbox Code Playgroud)\n
// this will end up with no result because 1011241050 = 60.70.80.90\ndb.collection.find({\n    start: { $lte: 1011241050 },\n    end: { $gte: 1011241050 },\n})\n
Run Code Online (Sandbox Code Playgroud)\n