假设,我运行一个API,当用户对用户资源发出GET请求时,我将以JSON格式返回相关字段

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

如您所见,User中的Secret字段有json:"-"个.这意味着在大多数操作中,我不想返回.在这种情况下,答案是

{
  "id":1,
  "Name": "John"
}

字段机密不会被返回,因为json:"-"省略了字段.

现在,我正在打开一个管理员专用的路径,在这里我想返回秘密字段.然而,这将意味着复制用户 struct .

我当前的解决方案如下所示:

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

有没有办法将用户嵌入adminUser?有点像继承:

type adminUser struct {      
  User
  Secret  string        `json:"secret,omitempty" bson:"secret,omitempty"`
}

上述方法目前不起作用,因为在这种情况下,只会返回字段机密.

注意:在实际的代码库中,只有几十个字段.因此,复制代码的成本很高.

实际的mongo查询如下:

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)
}

推荐答案

您应该看看bson包的内联标志

type adminUser struct {
    User `bson:",inline"`
    Secret string `json:"secret,omitempty" bson:"secret,omitempty"`
}

但是,现在您会注意到,您会出现重复的密钥错误

在你的情况下,我将从User中删除Secret字段

Mongodb相关问答推荐

$mod只支持数字类型,不支持MongoDb中的array和int

我们可以在Mongoose中这样使用Unique:[True,";This to Unique&qot;]吗

字段$set聚合导致错误美元($)前缀字段$concatArrays对于存储无效"

在MondoDB中:将对象数组从切片索引数组切片,并通过聚合推入数组

如何获取键值对的对象,其中值仅具有 mongoDB 中的投影字段

MongoDB - 家庭作业(job)帮助.不确定如何在 mongodb 中访问文档中的变量

$eq 的目的是什么

MongoDB中的readPreference和readConcern有什么区别?

MongoDB 2.1 聚合框架总和匹配名称的数组元素

$lookup 结果 mongodb 的计数

在 Mongoose 中填写所有必填字段

从每个组中 Select 前 N 行

Ruby 按键值分组哈希

MongoDB的数据库管理工具

是否有支持 MongoDB 和 Devise 的 Rails 管理界面?

在 mongodb 中插入当前日期时间

如何从 Mongoose 模型对象中获取集合名称

在 MongoDB 中快速搜索数十亿个小文档的策略

对于社交网站(使用 Ruby on Rails 开发)来说,MongoDB 会是一个好主意吗?

AsQueryable 方法是否在新的 Mongodb C# 驱动程序 2.0rc 中离开?