我在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一样?
答案 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个字节。