45

我有两个结构表示将插入 mongodb 数据库的模型。一个结构(投资)将另一个结构(组)作为其字段之一。

type Group struct {
    Base
    Name string `json:"name" bson"name"`
}

type Investment struct {
    Base
    Symbol string `json:"symbol" bson:"symbol" binding:"required"`
    Group  Group  `json:"group" bson:"group"`
    Fields bson.M `json:"fields" bson:"fields"`
}

我遇到的问题是在投资模型中,组不是必需的。如果没有组,我认为最好不要将其插入数据库中。在 Go 中处理这样的数据库模型的最佳方法是什么?

4

2 回答 2

61

tl;dr:使用,omitempty,如果您需要担心零值和 null/未指定之间的差异,请执行 GitHub API 的操作并使用指针


两者都json支持bson标签,omitempty。对于 json,“空值是 false、0、任何 nil 指针或接口值,以及任何长度为零的数组、切片、映射或字符串”(json docs)。对于 bson,,omitempty意味着“仅当字段未设置为类型的零值或空切片或映射时才包含该字段”,零值包括空字符串和 nil 指针(bson docs)。

所以如果你真的需要一个 Group 结构体,你可以放一个*Group代替,当指针为 nil 时它不会被存储。如果Investment只需要保存组,那就更简单了:""因为组名可以防止存储组密钥。

bson默认已经使用小写的字段名称,因此您可以在它们匹配时从 struct 标记中省略它。json将默认为大写名称,因此如果需要小写,请在标记中指定小写名称。

所以,最好的情况,也许你可以使用:

type Investment struct {
    Base
    Symbol string `json:"symbol" binding:"required"`
    Group string  `json:"group,omitempty" bson:",omitempty"`
    Fields bson.M `json:"fields"`
}

如果您遇到类型(“”、0、false 等)的零值与“未指定”不同的字段,您可以执行 GitHub API 所做的操作并将指针放入您的结构中——本质上是*Group把戏的延伸。

于 2014-06-14T06:04:49.413 回答
2

如果 strut 字段为空,请避免将它们编组-

结构字段可能是原始类型(字符串、整数、布尔等),甚至是另一种结构类型。

所以有时我们不希望结构的字段进入 json 数据(可能是数据库插入或外部 api 调用),如果它们是空的

示例

type Investment struct {
    Base
    Symbol string `json:"symbol" bson:"symbol" binding:"required"`
    Group  Group  `json:"group" bson:"group"`
    Fields bson.M `json:"fields" bson:"fields"`
}

如果我们希望SymbolGroup可能包含空值(0、false、nil 指针、零大小接口/结构),那么我们可以在 json 编组中避免它们,如下所示。

type Investment struct {
    Base
    Symbol string `json:"symbol,omitempty" bson:"symbol,omitempty" binding:"required"`
    Group  *Group  `json:"group,omitempty" bson:"group,omitempty"`
    Fields bson.M `json:"fields" bson:"fields"`
}

她的“ Group ”字段是指向Group结构的指针,只要它指向 nil 指针,它将从 json 编组中省略。

显然,我们将在 Group 字段中填充值,如下所示。

// declared investment variable of type Investment struct

 investment.Group = &groupData
于 2020-06-24T03:23:39.547 回答