2017-08-10 103 views
0

我有一个CSV〜我在MongoDB中已导入IP和国家代码(从https://db-ip.com)的600K记录的结构如下:通常MongoDB比较I.P.地址

{ 
    addr_type: "ipv4", 
    ip_start: "176.74.160.0", 
    ip_end: "176.74.179.207", 
    country: "GB" 
} 

在SQL,我会救“ip_start “和‘ip_end’的列VARBINARY(16),然后我可以运行此查询:

select * from `{$table_name}` where addr_type = ? and ip_start <= ? order by ip_start desc limit 1 

MongoDB中没有VARBINARY类型,我试图把它们插入字符串,但它并没有回到正确的值:

var country bson.M 
ip := "85.134.123.13" 
Db := db.MgoDb{} 
Db.Init() 
c := Db.C("dbip") 
if err := c.Find(bson.M{"addr_type": "ipv4", "ip_start": bson.M{"$lte": ip}}).Select(bson.M{"country":1, "_id":0}).Sort("ip_start").One(&country); err != nil { 
    log.Printf(err.Error()) 
} 
Db.Close() 

任何想法如何比较I.P.与MongoDB一样,从上面的SQL例子?

回答

0

我会将IP地址视为32位整数(假设为IPv4)。您可以使用net.ParseIP轻松转换。例如:

binary.BigEndian.Uint32(net.ParseIP("85.134.123.13").To4()) 

一旦这些存储为整数,然后找到一个特定的IP是在查询一个简单的数值比较。

否则,您可以使用net.ParseIP生成[]byte切片,将这些切片存储为二进制,并与您在SQL中一样进行比较。由此产生的字节片总是16个字节长,因此如果IPv4地址被解析,只有最后4个字节被使用。

+0

谢谢你的回答,这是否也适用于IPv6?因为我将IPv4和IPv6存储在我的数据库中。 –

+0

我在这里用你说的一个例子,但它打印0. https://play.golang.org/p/KJSMJlUdV- –

+0

我更新了我的答案,实际上没有运行我输入的代码。请参阅https://play.golang.org/p/O7SHmIuwCw –