从mgo查询获取ObjectIdHex值

安东尼:

我仍然很陌生,尽管在SO上看到与此类似的多个问题,但我无法重现某些OP所要求的输出(此答案看起来最接近)。

我正在做一些相当简单的事情,我users在mongo中找到了一个集合,而我要做的就是将_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"
icza:

与key关联的值"_id"的类型bson.ObjectId仅为a string

bson.M是一个类型map[string]interface{},因此您需要使用Type断言来将id作为以下形式获取ObjectId

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

并且ObjectId具有一个ObjectId.Hex()可以完全返回所需内容的方法:对象ID作为“纯”十六进制字符串:

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包和hex.EncodeToString()函数:

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

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章