3 回答

TA貢獻(xiàn)1833條經(jīng)驗(yàn) 獲得超4個(gè)贊
MongoDB 文檔中的屬性j是類型BinData3,因此在將它與字符串匹配時(shí)使用過(guò)濾器永遠(yuǎn)不會(huì)產(chǎn)生任何結(jié)果。
你的第二次嘗試是在正確的軌道上。除了您要過(guò)濾 UUID 字符串的十六進(jìn)制表示的 UTF-8 字節(jié)序列(這是 Go 在內(nèi)存中存儲(chǔ)字符串的方式,這是 -> 轉(zhuǎn)換產(chǎn)生的結(jié)果string)[]byte。這將永遠(yuǎn)不會(huì)產(chǎn)生任何結(jié)果。
原因是您必須提供的二進(jìn)制數(shù)據(jù)bson.Binary不是上述值,而是 UUID 的原始字節(jié)。
因此,您要做的是對(duì) UUID(以十六進(jìn)制表示形式提供給您)進(jìn)行十六進(jìn)制解碼,并使用此二進(jìn)制數(shù)據(jù)。
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)
請(qǐng)注意,您必須將 UUID 傳遞給hex.DecodeString()
不帶破折號(hào)的,因此您甚至不需要任何第三方庫(kù)來(lái)處理您擁有的 UUID 字符串。
另請(qǐng)注意,gopkg.in/mgo.v2
不再維護(hù)。而是使用社區(qū)支持的 fork:?github.com/globalsign/mgo
。

TA貢獻(xiàn)1821條經(jīng)驗(yàn) 獲得超6個(gè)贊
如果您有要查詢的 GUID,則轉(zhuǎn)換對(duì)我有用(重新排序密鑰字節(jié),然后轉(zhuǎn)換為十六進(jìn)制解碼):
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
}
進(jìn)而:
data := CsuuidToBinary(guidKey)
var a A
err := collection.Find(bson.M{"SomeKey": bson.Binary{Kind: 0x03, Data: data,}}).One(&a)

TA貢獻(xiàn)1864條經(jīng)驗(yàn) 獲得超6個(gè)贊
這是因?yàn)?UUID 存儲(chǔ)為二進(jìn)制數(shù)據(jù),您需要將其轉(zhuǎn)換為字符串才能查詢它
- 3 回答
- 0 關(guān)注
- 174 瀏覽
添加回答
舉報(bào)