为了账号安全,请及时绑定邮箱和手机立即绑定

从 mgo 查询中获取 ObjectIdHex 值

从 mgo 查询中获取 ObjectIdHex 值

Go
撒科打诨 2021-09-21 22:12:20
我还是个新手,虽然我看到多个与此类似的问题,但我无法重现某些 OP 要求的输出(这个答案看起来最接近)。我正在做一些相当简单的事情,我正在usersmongo 中点击一个集合,我想要做的就是将_id值作为字符串返回。我最终将把这些_id交给 NSQ,但这是我任务的重中之重。var users []bson.Merr = 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"
查看完整描述

1 回答

?
HUX布斯

TA贡献1876条经验 获得超6个赞

与 key 关联的值"_id"的类型bson.ObjectId只是 a string。


bson.M是一个类型map[string]interface{},所以你需要类型断言来获取 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))


查看完整回答
反对 回复 2021-09-21
  • 1 回答
  • 0 关注
  • 268 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信