从mgo查询中获取ObjectIdHex值

时间:2015-03-19 14:14:48

标签: mongodb go mgo

我还是新手,虽然我在SO上看到与此类似的多个问题,但我无法重现OP已经请求的输出(this answer looking the closest)。

我做了一件相当简单的事情,我在mongo中点击users集合,而我想做的就是将_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"

1 个答案:

答案 0 :(得分:11)

与关键"_id"相关联的值属于bson.ObjectId类型,只是string

bson.Mmap[string]interface{}类型,因此您需要Type assertion才能将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))