为什么我无法使用golang的mgo库找到ID?

为什么我无法使用golang的mgo库找到ID?,第1张

为什么我无法使用golang的mgo库找到ID?

如错误消息所提示,对象ID的长度恰好为12个字节(12个字节的数据)。您看到的24个字符长的ID是ID的12个字节的十六进制表示形式(1个字节=>
2个十六进制数字)。

使用该

bson.ObjectIdHex()
函数获取
bson.ObjectId
十六进制表示形式是否可用的值。

err = coll.FindId(bson.ObjectIdHex(message.ID)).One(&result)

对于相反的方向,您可以使用

ObjectId.Hex()
此答案中详细介绍的方法:从mgo查询获取ObjectIdHex值

与key关联的值

"_id"
类型
bson.ObjectId
仅为
a string

bson.M

是一个类型
map[string]interface{}
,因此您需要Type断言才能将id作为以下形式获取
ObjectId:

objid, ok := m["_id"].(ObjectId)if !ok {    panic("Not ObjectId")}

并且

ObjectId
具有一个
ObjectId.Hex()
可以完全返回您想要的方法的方法:对象ID作为“纯”十六进制字符串:

fmt.Println(objid.Hex())

备择方案objid可以简单地转换为,string因为其基础类型为string。因此,您可以使用许多其他选项将其转换为十六进制string:

hexid := fmt.Sprintf("%x", string(objid))

如果只想打印它,则可以直接执行以下 *** 作:

fmt.Printf("%x", string(objid))

注意:将其转换为

string
非常重要,否则
fmt
程序包将调用其
String()
方法,该方法将产生类似的字符串,
ObjectIdHex("537f700b537461b70c5f0000")
而这将被转换为十六进制,这显然不是您想要的。

或者,您可以使用encoding/hex包和hex.EnpreToString()函数:

hexid := hex.EnpreToString([]byte(objid))

您在代码中所做的是一个简单的类型转换(给定

message.ID
为type
string
),并且语法是有效的,因为的基础类型
bson.ObjectId
string
,因此基本上将24个字符解释为
bson.ObjectId
type,但是它是无效
ObjectId
值,因为它将是24个字节而不是12个字节。



欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5012997.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-11-15
下一篇 2022-11-14

发表评论

登录后才能评论

评论列表(0条)

保存