MongoDB中的IP地址存储,排序和过滤

时间:2014-06-08 02:01:03

标签: regex mongodb filtering ip-address

我试图弄清楚如何在数据库中存储IP地址,尤其是MongoDB,因此我可以轻松地对这些地址进行排序和过滤。我查看了几个问题:

Most efficient way to store IP Address in MySQL

save IP address in mongoDB

equivalent of INET_ATON() in mongodb

我已经实现了上一个问题的答案:

// ip example: 192.168.2.1
function inet_aton(ip){
    // split into octets
    var a = ip.split('.');
    var buffer = new ArrayBuffer(4);
    var dv = new DataView(buffer);
    for(var i = 0; i < 4; i++){
        dv.setUint8(i, a[i]);
    }
    return(dv.getUint32(0));
}

// num example: 3232236033
function inet_ntoa(num){
    var nbuffer = new ArrayBuffer(4);
    var ndv = new DataView(nbuffer);
    ndv.setUint32(0, num);

    var a = new Array();
    for(var i = 0; i < 4; i++){
        a[i] = ndv.getUint8(i);
    }
    return a.join('.');
}

这实际上非常有效。我将我的IP存储为int,然后在将它们发送到我的UI之前将它们转换回IP,并且因为我将它们存储为int,所以排序是免费的。

问题变成了过滤。如果用户想要查找以 102.1 * 开头的IP,那么这似乎是一种合理的方法,特别是如果用户想要使用正则表达式。如果他们搜索完整的IP,那没问题,但部分匹配是一种麻烦。

有没有人对此问题有任何见解?我喜欢听到任何想法。

1 个答案:

答案 0 :(得分:0)

我猜你可以选择复制并在同一个文档中有两个字段,一个是你的ip地址的整数值,另一个是字符串形式。这将是写入期间的一次性过程。如果必须排序,可以使用整数形式,如果必须进行任何正则表达式搜索,可以使用它的字符串形式。您所要做的就是节省额外的空间!