从 mgo 查询中获取 ObjectIdHex 值

Obtain ObjectIdHex value from mgo query

我还是个新手,虽然我在 SO 上看到了多个与此类似的问题,但我无法重现某些 OP 要求的输出 (this answer looking the closest)。

我正在做一些相当简单的事情,我在 mongo 中点击一个 users 集合,我想要做的就是将 _id 值作为字符串返回。我最终会将这些 _id 推到 NSQ,但这是我的首要任务。

var users []bson.M
err = sess.DB("db_name").C("users").Find(bson.M{}).All(&users)

if err != nil {
    os.Exit(1)
}

for _, user := range users {
    fmt.Printf("%+v \n", user["_id"])
}

今天输出:

ObjectIdHex("537f700b537461b70c5f0000")
ObjectIdHex("537f700b537461b70c600000")
ObjectIdHex("537f700b537461b70c610000")
ObjectIdHex("537f700b537461b70c620000")

我浏览了 bson#m 文档并认为我正确地使用了地图以增加价值。所以我想,我的查询结果是:

{"_id" : ObjectIdHex("Some_ID") }

但是如果 ObjectIdHex("ID") 是值,我如何简单地获取其中的字符串。

如此理想的输出:

"537f700b537461b70c5f0000"
"537f700b537461b70c600000"
"537f700b537461b70c610000"
"537f700b537461b70c620000"

与键 "_id" 关联的值是 bson.ObjectId 类型,它只是一个 string.

bson.M is a type map[string]interface{}, so you need Type assertion 获取 id 作为 ObjectId:

objid, ok := m["_id"].(ObjectId)
if !ok {
    panic("Not ObjectId")
}

并且 ObjectId 有一个 ObjectId.Hex() 方法,它 returns 正是您想要的:对象 ID 作为 "pure" 十六进制字符串:

fmt.Println(objid.Hex())

备选方案

objid 可以简单地转换为 string,因为它的基础类型是 string。因此,您可以使用许多其他选项将其转换为十六进制 string:

hexid := fmt.Sprintf("%x", string(objid))

如果只是想打印出来,可以直接做:

fmt.Printf("%x", string(objid))

注意: 将其转换为 string 很重要,否则 fmt 包将调用它的 String() 方法,这会产生如下字符串ObjectIdHex("537f700b537461b70c5f0000") 这就是将要转换为十六进制的内容,这显然不是您想要的。

或者您可以使用encoding/hex package and the hex.EncodeToString()函数:

hexid := hex.EncodeToString([]byte(objid))