2017-08-10 63 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 –