从 mgo 查询中获取 ObjectIdHex 值
Obtain ObjectIdHex value from mgo query
我还是个新手,虽然我在 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"
与键 "_id"
关联的值是 bson.ObjectId
类型,它只是一个 string
.
bson.M
is a type map[string]interface{}
, so you need Type assertion 获取 id 作为 ObjectId
:
objid, ok := m["_id"].(ObjectId)
if !ok {
panic("Not ObjectId")
}
并且 ObjectId
有一个 ObjectId.Hex()
方法,它 returns 正是您想要的:对象 ID 作为 "pure" 十六进制字符串:
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
package and the hex.EncodeToString()
函数:
hexid := hex.EncodeToString([]byte(objid))
我还是个新手,虽然我在 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"
与键 "_id"
关联的值是 bson.ObjectId
类型,它只是一个 string
.
bson.M
is a type map[string]interface{}
, so you need Type assertion 获取 id 作为 ObjectId
:
objid, ok := m["_id"].(ObjectId)
if !ok {
panic("Not ObjectId")
}
并且 ObjectId
有一个 ObjectId.Hex()
方法,它 returns 正是您想要的:对象 ID 作为 "pure" 十六进制字符串:
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
package and the hex.EncodeToString()
函数:
hexid := hex.EncodeToString([]byte(objid))