我在 golang 中使用 mgo 库进行 mongodb 操作,这是我的代码:
session.SetMode(mgo.Monotonic, true)
coll := session.DB("aaaw_web").C("cron_emails")
var result Result
fmt.Printf("%v", message.ID)
err = coll.FindId(bson.ObjectId(message.ID)).One(&result)
fmt.Printf("%v", result)
fmt.Println(err)
我得到这个输出:
595f2c1a6edcba0619073263
{ObjectIdHex("") 0 0 0 0 { 0 false 0 } 0 0 0 0 0 0 0}
ObjectIDs must be exactly 12 bytes long (got 24)
not found
但我检查过,文档存在于 mongodb 中,但到这里没有结果,知道我错过了什么......
正如错误消息所提示的那样,对象 id 的长度正好是 12 个字节(12 个字节的数据)。您看到打印的 24 个字符长的 ID 是 12 个字节的 ID 的十六进制表示形式(1 个字节 => 2 个十六进制数字)。
Use the bson.ObjectIdHex()函数来获取值bson.ObjectId如果十六进制表示可用。
err = coll.FindId(bson.ObjectIdHex(message.ID)).One(&result)
对于相反方向,您可以使用ObjectId.Hex()方法,在这个答案中有详细说明:从 mgo 查询中获取 ObjectIdHex 值
你在代码中所做的很简单类型转换(鉴于message.ID
属于类型string
),并且语法是有效的,因为底层类型bson.ObjectId
is string
,这样基本上将 24 个字符解释为bson.ObjectId
类型,但它是无效的ObjectId
值,因为它将是 24 字节而不是 12。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)