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 关注
- 131 浏览
添加回答
举报