我在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中,但是到这里没有结果,任何想法我错过了什么......
答案 0 :(得分:8)
当错误消息提示时,对象id正好是12个字节长(12个字节的数据)。您看到的24个字符长ID是ID的12个字节的十六进制表示(1个字节=> 2个六位数字)。
如果十六进制表示可用,请使用bson.ObjectIdHex()
函数获取bson.ObjectId
的值。
state
对于反方向,您可以使用ObjectId.Hex()
方法,详见答案:Obtain ObjectIdHex value from mgo query
您在代码中所做的是一个简单的type conversion(假设err = coll.FindId(bson.ObjectIdHex(message.ID)).One(&result)
的类型为message.ID
),并且语法有效,因为string
的基础类型是bson.ObjectId
,因此基本上将24个字符解释为string
类型,但它是无效的bson.ObjectId
值,因为它将是24个字节而不是12个。