3 回答

TA貢獻1833條經驗 獲得超4個贊
MongoDB 文檔中的屬性j是類型BinData3,因此在將它與字符串匹配時使用過濾器永遠不會產生任何結果。
你的第二次嘗試是在正確的軌道上。除了您要過濾 UUID 字符串的十六進制表示的 UTF-8 字節序列(這是 Go 在內存中存儲字符串的方式,這是 -> 轉換產生的結果string)[]byte。這將永遠不會產生任何結果。
原因是您必須提供的二進制數據bson.Binary不是上述值,而是 UUID 的原始字節。
因此,您要做的是對 UUID(以十六進制表示形式提供給您)進行十六進制解碼,并使用此二進制數據。
data, err := hex.DecodeString(m.ID)
if err != nil {
? ? panic(err)
}
e := c.Find(bson.M{"j": bson.Binary{
? ? Kind: bson.BinaryUUIDOld,
? ? Data: data,
}}).One(&job)
請注意,您必須將 UUID 傳遞給hex.DecodeString()
不帶破折號的,因此您甚至不需要任何第三方庫來處理您擁有的 UUID 字符串。
另請注意,gopkg.in/mgo.v2
不再維護。而是使用社區支持的 fork:?github.com/globalsign/mgo
。

TA貢獻1821條經驗 獲得超6個贊
如果您有要查詢的 GUID,則轉換對我有用(重新排序密鑰字節,然后轉換為十六進制解碼):
func CsuuidToBinary(key string) []byte {
hexStr := strings.Replace(key, "-", "", -1)
first := hexStr[6:8] + hexStr[4:6] + hexStr[2:4] + hexStr[0:2]
second := hexStr[10:12] + hexStr[8:10]
third := hexStr[14:16] + hexStr[12:14]
fourth := hexStr[16:len(hexStr)]
hexStr = first + second + third + fourth
data, _ := hex.DecodeString(hexStr)
return data
}
進而:
data := CsuuidToBinary(guidKey)
var a A
err := collection.Find(bson.M{"SomeKey": bson.Binary{Kind: 0x03, Data: data,}}).One(&a)
- 3 回答
- 0 關注
- 181 瀏覽
添加回答
舉報