从 mgo 查询中获取 ObjectIdHex 值

我还是个新手,虽然我看到多个与此类似的问题,但我无法重现某些 OP 要求的输出(这个答案看起来最接近)。


我正在做一些相当简单的事情,我正在usersmongo 中点击一个集合,我想要做的就是将_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"


撒科打诨
浏览 270回答 1
1回答

HUX布斯

与 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))
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Go