从mgo查询中获取ObjectIdHex值

Ant*_*ony 4 go mongodb mgo

我还是新手,虽然我在SO上看到了类似的多个问题,但是我无法重现一些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"])
}
Run Code Online (Sandbox Code Playgroud)

今天这个输出:

ObjectIdHex("537f700b537461b70c5f0000")
ObjectIdHex("537f700b537461b70c600000")
ObjectIdHex("537f700b537461b70c610000")
ObjectIdHex("537f700b537461b70c620000")
Run Code Online (Sandbox Code Playgroud)

我浏览了bson #m docs,并认为我正确使用地图以增加价值.所以我认为,我的查询结果如下:

{"_id" : ObjectIdHex("Some_ID") }
Run Code Online (Sandbox Code Playgroud)

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

如此理想的输出:

"537f700b537461b70c5f0000"
"537f700b537461b70c600000"
"537f700b537461b70c610000"
"537f700b537461b70c620000"
Run Code Online (Sandbox Code Playgroud)

icz*_*cza 11

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

bson.M是一个类型map[string]interface{},所以你需要Type断言来获取id为ObjectId:

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

并且ObjectId有一个ObjectId.Hex()方法可以准确地返回你想要的东西:对象id作为"纯"十六进制字符串:

fmt.Println(objid.Hex())
Run Code Online (Sandbox Code Playgroud)

备择方案

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

hexid := fmt.Sprintf("%x", string(objid))
Run Code Online (Sandbox Code Playgroud)

如果您只想打印它,可以直接进行:

fmt.Printf("%x", string(objid))
Run Code Online (Sandbox Code Playgroud)

注意:转换它string是重要的,否则fmt包会调用它的String()方法,这会产生一个类似的字符串ObjectIdHex("537f700b537461b70c5f0000"),这将转换为十六进制,这显然不是你想要的.

或者您可以使用encoding/hex包和hex.EncodeToString()功能:

hexid := hex.EncodeToString([]byte(objid))
Run Code Online (Sandbox Code Playgroud)