MongoDB比较I.P.地址

时间:2017-08-10 12:23:41

标签: mongodb

我在mongoDB中导入了大约600k的I.P.s和国家代码(来自https://db-ip.com)的csv,结构如下:

{
    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.与上面的SQL示例中的MongoDB一样?

1 个答案:

答案 0 :(得分:0)

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

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

一旦将它们存储为整数,那么在查询中查找特定IP就是一个简单的数字比较。

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