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

时间:2017-07-07 08:55:22

标签: 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)

我收到了这个输出:

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中,但是到这里没有结果,任何想法我错过了什么......

1 个答案:

答案 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个。