【问题标题】:Obtain ObjectIdHex value from mgo query从 mgo 查询中获取 ObjectIdHex 值
【发布时间】:2015-03-19 14:14:47
【问题描述】:

我还是新手,虽然我在 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"

【问题讨论】:

    标签: mongodb go mgo


    【解决方案1】:

    与键"_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") 的字符串,这就是将转换为hex 这显然不是你想要的。

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

    hexid := hex.EncodeToString([]byte(objid))
    

    【讨论】:

    • 是否有理由使用hex.EncodeToString([]byte(objid)) 而不是Hex 方法?
    • @BeBop 我不这么认为。我只是不知道Hex() 方法。我应该将其添加到答案中还是将其作为新答案发布?
    猜你喜欢
    • 2020-02-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-15
    • 2014-12-03
    • 1970-01-01
    相关资源
    最近更新 更多