为什么我不能使用golang的mgo库找到ID?

Gau*_*arg 7 go mgo

我在golang中使用mgo库进行mongo操作,这是我的代码:

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)
Run Code Online (Sandbox Code Playgroud)

我得到这个输出:

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
Run Code Online (Sandbox Code Playgroud)

但我查了一下,文件存在于mongo中,但是到这里没有结果,任何想法我错过了什么...

icz*_*cza 11

正如错误消息提示的那样,对象id正好是12个字节长(12个字节的数据).您看到的24个字符长ID是ID的12个字节的十六进制表示(1个字节=> 2个六位数).

如果十六进制表示可用bson.ObjectIdHex(),bson.ObjectId则使用该函数获取值.

err = coll.FindId(bson.ObjectIdHex(message.ID)).One(&result)
Run Code Online (Sandbox Code Playgroud)

对于反方向,您可以使用ObjectId.Hex()此答案中详述的方法:从mgo查询中获取ObjectIdHex值

你在你的代码中做了什么是一个简单的类型转换(给定message.ID的类型string),并且语法是有效的,因为基础类型bson.ObjectIdstring,所以基本上将24个字符解释为bson.ObjectId类型,但它是一个无效的ObjectId值,因为它将是24个字节而不是12个字节.