mgo 将 bson.objectId 转换为 html 模板中的字符串(十六进制)

Posted

技术标签:

【中文标题】mgo 将 bson.objectId 转换为 html 模板中的字符串(十六进制)【英文标题】:mgo convert bson.objectId to string(hex) in html template 【发布时间】:2015-05-14 11:29:24 【问题描述】:

我知道这个问题可能与this one 重复。但直到现在还没有得到满意的答复。我真的很想引起人们的注意,以便尽快找到解决方案。所以我请求你不要关闭这个问题,除非你有解决方案并在上一个问题中回答了:-)

我将描述这个问题以使人信服:

我有一个存储在 mongodb 中的数据结构,众所周知,mongodb 的 _id 是一个 bson.ObjectId 类型,我可以这样检索它:

type Data struct 
    Id bson.ObjectId `bson:"_id,omitempty"`
    Content string `bson:"content"`

然后我通过查找特定查询条件得到了Data 的切片,并使用http/template 中的切片来呈现前端视图。为了操作切片中的每个项目,我想使用Id 字段,但是当使用它时:

range $key, $value := .DataSlice
  <td>$value.Id</td>
end

这只给出了一种类似ObjectIdHex("550146d1b51bc1c208d1924d") 的字符串,而不是550146d1b51bc1c208d1924d,它很好用且易于使用。

在duplicate issue。操作员说,他找到了解决此问题的方法,方法是在原始数据结构中“添加Id_String”。但我真的不知道该怎么做?这是否意味着在检索后分配它?由于我使用切片来存储检索到的数据,并且切片中的数据不能轻易更改。这样做会比使用 jquery 在前端完成工作更复杂。但是这样做只会让我心爱的 Go 感到沮丧:-(。

那么有没有更好的方法来做到这一点?

【问题讨论】:

bson.ObjectId in a template的可能重复 【参考方案1】:

bson.ObjectId 类型提供了一种Hex 方法,该方法将返回您正在寻找的十六进制表示,template 包允许对您手头的值调用任意方法,因此无需存储该值在其他任何地方作为字符串重复。

这会起作用,例如:

<td>$value.Id.Hex</td>

【讨论】:

另外,在生成新的对象 ID 时,您可以调用 bson.NewObjectId().Hex() 并仅获取字符串 - 以防您稍后想要将其插入数据库并使用字符串输入 _id 字段。【参考方案2】:

你也可以像下面这样定义结构

type Data struct 
    Id bson.ObjectId `json:"id" bson:"_id,"`
    Content string `json:"content" bson:"content"`

那么你可以在模板html的时候使用&lt;td&gt;$value.Id&lt;/td&gt;

【讨论】:

以上是关于mgo 将 bson.objectId 转换为 html 模板中的字符串(十六进制)的主要内容,如果未能解决你的问题,请参考以下文章

BSON::ObjectId 与 Mongo::ObjectID

BSON::ObjectId 与 Mongo::ObjectID

golang:bson.ObjectId与string转化

python 在pymongo的bson.objectid,没有依赖,独立工作

mgo中的Golang Bson排序参数

如何使用连接池将我的 mgo 会话转换为 mongo-go-driver 客户端?