我还是个新手,虽然我看到多个与此类似的问题,但我无法重现某些 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))
- 1 回答
- 0 关注
- 268 浏览
添加回答
举报
0/150
提交
取消