首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MongoDB ipv4 4/ipv4 6十六进制指数

MongoDB ipv4 4/ipv4 6十六进制指数
EN

Stack Overflow用户
提问于 2022-07-08 17:10:55
回答 1查看 48关注 0票数 0

我正在建设一个ips 4/ips 6 geo ip MongoDB数据库,我将拥有数百万ips (100+)。

数据库的结构将是

代码语言:javascript
复制
[
    { _id: 58fdbf5c0ef8a50b4cdd9a8e , ip: '34.53.63.25', ip_hex: '0x22353f19' , type: "ipv4", data : [
        {
            country : "CA",
            region : "region1"
            city : "city1",
            blacklisted : "no"
            on_date : ISODate("2022-05-05T00:00:00Z")
        },
        {
            country : "CA",
            region : "region1"
            city : "city1",
            blacklisted : "yes"
            on_date : ISODate("2022-06-05T00:00:00Z")
        },
        {
            country : "US",
            region : "region2"
            city : "city2",
            blacklisted : "no"
            on_date : ISODate("2022-05-05T00:00:00Z")
        },

        ...
    ]},

    { _id: 58fdbf5c0ef8a50b4cdd9a8e , ip: '1.2.3.4', ip_hex: '0x1020304', type: "ipv4", data : [
        {
            country : "CA",
            region : "region1"
            city : "city1",
            blacklisted : "no"
            on_date : ISODate("2022-06-05T00:00:00Z")
        },
    ]},


    { _id: 58fdbf5c0ef8a50b4cdd9a8e , ip: '2345:0425:2CA1:0000:0000:0567:5673:23b5', ip_hex: '0x234504252ca1000000000567567323b5', type: "ipv6", data : [
        {
            country : "FR",
            region : "region1"
            city : "city1",
            blacklisted : "no"
            on_date : ISODate("2022-06-05T00:00:00Z")
        },
        {
            country : "FR",
            region : "region1"
            city : "city1",
            blacklisted : "yes"
            on_date : ISODate("2022-07-05T00:00:00Z")
        },

        ...
    ]},


] 

我正在将所有IP字符串数据转换为HEX:

代码语言:javascript
复制
1.1.1.1 -> 0x1010101
1.2.3.4 -> 0x1020304
34.53.63.25 -> 0x22353f19
255.255.255.255 -> 0xffffffff

0001:0001:0001:0001:0001:0001:0001:0001 -> 0x10001000100010001000100010001
1111:1111:1111:1111:1111:1111:1111:1111 -> 0x11111111111111111111111111111111
2345:0425:2CA1:0000:0000:0567:5673:23b5 -> 0x234504252ca1000000000567567323b5
2345:0425:2CA1::0567:5673:23b5          -> 0x234504252ca1000000000567567323b5
ffff:ffff:ffff:ffff:ffff:ffff:ffff:ffff -> 0xffffffffffffffffffffffffffffffff

会有大量的IP搜索,每天都会为每个IP添加/删除/更新新的数据。

我将搜索范围的ips,排序,更新,删除。

在"ip_hex“列上推荐什么索引?我在想在HEX上搜索B树而不是STR。

我想要一个高效的数据库。我还应该考虑哪些其他优化?

谢谢。

EN

回答 1

Stack Overflow用户

发布于 2022-07-09 09:30:29

您应该用前导"0“填充十六进制字符串,否则排序和范围将无法正常工作。

注意IPv6地址的不同格式。以下地址都是同一IP的有效表示形式

2345:0425:2CA1:0000:0000:0567:5673:23b5 2345:0425:2CA1:0567:5673:23b5 2345:0425:2ca1:0:0:0567:5673:23b5 2345:0425:2CA1:0000:0000:567:5673:23b5

确保格式一致,否则查询将很困难。

当你谈到IP范围时,你指的是典型的IP子网。为了计算子网,您需要像and or not xor这样的布尔函数。它们在MongoDB聚合框架中不可用(请参阅https://jira.mongodb.org/browse/SERVER-55386?filter=-2),您需要在外部处理它们。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72914790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档