从mgo查询获取ObjectIdHex值
我仍然很陌生,尽管在SO上看到与此类似的多个问题,但我无法重现某些OP所要求的输出。
我正在做一些相当简单的事情,我users
在mongo中找到了一个集合,而我要做的就是将_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"
回答:
与key关联的值"_id"
的类型bson.ObjectId
仅为a
string
。
bson.M
是一个类型map[string]interface{}
,因此您需要Type断言来将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))
以上是 从mgo查询获取ObjectIdHex值 的全部内容, 来源链接: utcz.com/qa/417577.html