我在 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)
我得到这个输出:
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
但我检查过,文件存在于 mongo 中,但没有得到任何结果,不知道我错过了什么......
最佳答案
正如错误消息提示的那样,一个对象 ID 正好是 12 个字节长(12 个字节的数据)。您看到打印的 24 个字符长的 ID 是 ID 的 12 个字节的十六进制表示(1 个字节 => 2 个十六进制数字)。
使用 bson.ObjectIdHex()
函数获取 bson.ObjectId
的值如果十六进制表示可用。
err = coll.FindId(bson.ObjectIdHex(message.ID)).One(&result)
对于反向,您可以使用 ObjectId.Hex()
方法,详见此答案:Obtain ObjectIdHex value from mgo query
您在代码中所做的很简单 type conversion (假设 message.ID
是 string
类型),语法是有效的,因为 bson.ObjectId
的底层类型是 string
,因此基本上将 24 个字符解释为 bson.ObjectId
类型,但它是一个无效的 ObjectId
值,因为它将是 24 个字节而不是 12 个。
关于go - 为什么使用golang的mgo库找不到id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45006415/