首页 > 后端开发 > Golang > 正文

如何在 Go 中使用 MongoDB 处理嵌入式类型和 JSON 封送处理?

Susan Sarandon
发布: 2024-11-08 19:42:02
原创
451 人浏览过

How to Handle Embedded Types and JSON Marshaling with MongoDB in Go?

Go 中 MongoDB 的嵌入类型和 JSON 编组

在 MongoDB 中,嵌入类型是表示分层数据结构的常用方法。然而,当使用带有嵌入类型的 Go 的 JSON 编码器时,重要的是要考虑如何处理省略的字段。

假设你有一个 User 结构,其中的 Secret 字段用 json:"-" 注释,以将其从常规 JSON 中排除回应。要返回管理员用户的 Secret 字段,您可能会想创建一个具有重复 Secret 字段的单独的 adminUser 结构。但是,这种方法会重复代码并可能导致维护问题。

相反,请考虑对 adminUser 中的 User 字段使用 bson:",inline" 标记。这指示 JSON 编码器内联嵌入结构的字段,有效地将它们组合成单个 JSON 对象。

type adminUser struct {
    User  `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}
登录后复制

但是,这种方法在从 MongoDB 读取时可能会引入重复的键错误,因为 adminUser 和用户包含 Secret 字段。要解决此问题,请从 User 中删除 Secret 字段,并将其仅包含在 adminUser 中。

type User struct {
    Id   bson.ObjectId `json:"id,omitempty" bson:"_id,omitempty"`
    Name string        `json:"name,omitempty" bson:"name,omitempty"`
}

type adminUser struct {
    User  `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}
登录后复制

现在,当检索具有管理员用户的用户时,Secret 字段将包含在 JSON 响应中。

func getUser(w http.ResponseWriter, r *http.Request) {
    ....omitted code...

    var user adminUser
    err := common.GetDB(r).C("users").Find(
        bson.M{"_id": userId},
    ).One(&user)
    if err != nil {
        return
    }
    common.ServeJSON(w, &user)
}
登录后复制

此方法保留了 User 结构的单一事实来源,并允许您根据用户权限动态包含或排除秘密字段。

以上是如何在 Go 中使用 MongoDB 处理嵌入式类型和 JSON 封送处理?的详细内容。更多信息请关注PHP中文网其他相关文章!

来源:php.cn
本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板