go - 为什么使用golang的mgo库找不到id?

标签 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 中,但没有得到任何结果,不知道我错过了什么......

最佳答案

正如错误消息提示的那样,一个对象 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.IDstring 类型),语法是有效的,因为 bson.ObjectId 的底层类型是 string,因此基本上将 24 个字符解释为 bson.ObjectId 类型,但它是一个无效的 ObjectId 值,因为它将是 24 个字节而不是 12 个。

关于go - 为什么使用golang的mgo库找不到id?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45006415/

相关文章:

mongodb - 防止 mgo/bson Unmarshal 清除未导出的字段

go - 如何构建 mgo 查询?

mongodb - 如何设置 slice 中的所有数据,使用 mgo 从 mongodb 获取?

mongodb - 如何在 Go 中使用 mgo 对文档进行部分和全部更新

go - 可执行文件不在路径中 - GO

dictionary - 为什么我不能在 Go 中使用 new() 初始化 map ?

go - cmd.Process.Kill() 调用后进程不会终止

go - Golang 中 runtime.LockOSThread 的好处

sorting - 使用 goroutine 的合并排序与普通合并排序

optimization - MongoDB - mgo 库 (Golang) - 多次插入/更新