gpt4 book ai didi

json - 我可以在 mgo 中使用 json 标签作为 bson 标签吗?

转载 作者:IT王子 更新时间:2023-10-29 01:45:34 27 4
gpt4 key购买 nike

我在我的项目中使用了thrift,thrift 将生成如下代码:

type CvJdRelationInfo struct {
JdId string `thrift:"jdId,1" json:"jdId"`
CvId string `thrift:"cvId,2" json:"cvId"`
Status int16 `thrift:"status,3" json:"status"`
AcceptTimestamp int64 `thrift:"acceptTimestamp,4" json:"acceptTimestamp"`
}

如你所见,thrift 已经生成了 json 标签(但是 没有 bson 标签),当我使用 mgo 保存记录时,mgo 将自动转换:

JdId -> jdid
CvId -> cvid
Status -> status
AcceptTimeStamp -> accepttimestamp

我需要的是:

type CvJdRelationInfo struct {
JdId string `thrift:"jdId,1" json:"jdId" bson:"jdId"`
CvId string `thrift:"cvId,2" json:"cvId" bson:"cvId"`
Status int16 `thrift:"status,3" json:"status" bson:"status"`
AcceptTimestamp int64 `thrift:"acceptTimestamp,4" json:"acceptTimestamp" bson:"acceptTimestamp"`
}

如您所见,bson tagsjson tags 相同。我可以将 json 标签 用作 bson 标签 吗?

最佳答案

MongoDB 实际上将数据存储为二进制 JSON (bson),这与 JSON 不同。这有点令人困惑,因为如果你使用 mongo shell 访问数据库,你会得到原始的 JSON,但它实际上是一种转换,而不是存储格式。因此,在将数据存储到数据库时,“mgo”驱动程序序列化为 bson

此序列化忽略 json 导出键,并通过默认为结构字段的小写版本选择适当的名称。 (参见 bson.Marshal go doc。)如果您指定 bson 导出键,它将忽略结构字段名称并使用您指定的任何内容作为 bson 导出键.

例如,

type User struct {
Name string
UserAge int `bson:"age"`
Phone string `json:"phoneNumber"`
}

将在 MongoDB 中产生以下结构:

{
"name": "",
"age": 0,
"phone": ""
}

所以看起来您的结构字段应该为您处理大部分事情。

如果你不指定 bson 导出键,你可能看不到的一个“陷阱”是,你没有能力执行 bson :",omitempty" 用于省略空白字段,或 bson:",inline" 用于编码(marshal)嵌入式(或嵌套)结构。

例如,这是处理嵌入式结构的方式:

type Employee struct {
User `bson:",inline"`
JobTitle string
EmployeeId string
Salary int
}

我在 bson.Marshal 上提供的链接中指定了这些类型的内容。希望对您有所帮助!

关于json - 我可以在 mgo 中使用 json 标签作为 bson 标签吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33643442/

27 4 0