我试图弄清楚如何在数据库中存储IP地址,尤其是MongoDB,因此我可以轻松地对这些地址进行排序和过滤。我查看了几个问题:
Most efficient way to store IP Address in MySQL
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,那没问题,但部分匹配是一种麻烦。
有没有人对此问题有任何见解?我喜欢听到任何想法。
答案 0 :(得分:0)
我猜你可以选择复制并在同一个文档中有两个字段,一个是你的ip地址的整数值,另一个是字符串形式。这将是写入期间的一次性过程。如果必须排序,可以使用整数形式,如果必须进行任何正则表达式搜索,可以使用它的字符串形式。您所要做的就是节省额外的空间!