如何在 Golang 结构中使用 omitempty 标志更新 Mongodb 字段

Ama*_*aur 6 forms json struct go mongodb

我正在处理优惠券表格,其中有一些可选字段。

介绍:

所有表单字段值都作为 JSON 接收并映射到 Golang 结构中。在结构中,我为每个字段添加了一个“omitempty”标志。因此,只有那些具有适当值的表单值才会被映射,其余的值(如 0、“”、false)将被结构忽略。

这是Golang的结构

type Coupon struct {
    Id               int    `json:"id,omitempty" bson:"_id,omitempty"`
    Name             string `json:"name,omitempty" bson:"name,omitempty"`
    Code             string `json:"code,omitempty" bson:"code,omitempty"`
    Description      string `json:"description,omitempty" bson:"description,omitempty"`
    Status           bool   `json:"status" bson:"status"`
    MaxUsageLimit    int    `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"`
    SingleUsePerUser bool   `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"`
}
Run Code Online (Sandbox Code Playgroud)

问题:

  1. 当我第一次保存这个表单时,合适的表单值会保存到 Mongodb 中。

  2. 现在我想更新该表单并假设有一个复选框,该复选框在保存数据时已选中。更新表单时,未选中该复选框并提交表单以保存。现在因为我在结构中应用了“omitempty”标志,所以它没有将空值映射到复选框字段。由于该值未映射到结构中,因此不会保存到数据库中。

  3. 当用户第二次编辑表单时,它会看到相同的复选框被选中。(但实际上,该值应更新到数据库中,并且复选框应显示为未选中状态。)

  4. 我在 REST API 中使用相同的表单数据(JSON 格式)。在 API 中,在更新表单数据时,如果我只提到那些必需的值并且不传递我不想更新的值,那么 MongoDB 就会使用提供的必需值覆盖整个文档(即使这些值是也被覆盖,我不想更新也不想传入 API)。

要求:

将来,我想公开 REST API,所以我不希望这件事发生在那里。这就是为什么我不想从结构字段中删除“omitempty”标志。

在结构中使用 omitempty 标志时,有什么方法可以将空表单值或 API 数据字段保存到数据库中?

谢谢!

icz*_*cza 9

booltype的值有 2 个可能的值:falsetrue。并且您想用一个bool字段“沟通”3 个不同的状态,即不更新该字段、将该字段设置为false以及将该字段设置为true. 这显然是不可能的。

同样的问题也发生在int值:值0不能代表2点不同的选择,即不更新领域,将其设置为0

如果您想保留omitempty标签值中的选项,那么要使其工作,您必须将字段更改为指针:

type Coupon struct {
    Id               *int    `json:"id,omitempty" bson:"_id,omitempty"`
    Name             string `json:"name,omitempty" bson:"name,omitempty"`
    Code             string `json:"code,omitempty" bson:"code,omitempty"`
    Description      string `json:"description,omitempty" bson:"description,omitempty"`
    Status           *bool   `json:"status" bson:"status"`
    MaxUsageLimit    *int    `json:"max_usage_limit,omitempty" bson:"max_usage_limit,omitempty"`
    SingleUsePerUser *bool   `json:"single_use_per_user,omitempty" bson:"single_use_per_user,omitempty"`
}
Run Code Online (Sandbox Code Playgroud)

它的工作方式是,如果指针是nil,它将被排除在外(这是“省略”选项)。如果该字段是一个非nil指针,它将被更新为指向的值。

因此,例如,如果您想排除一个bool字段,则该*bool值应该/将是nil. 如果要将其设置/更新为false,则它必须是指向false值的指针。如果要将其设置/更新为true,则它必须是指向true值的指针。

在一般情况下,任何类型,其零值是可能的,如果你把它的指针应,你只能处理“它是在零值”和“它是从输入失踪”来计算,而nil价值指针将表示“从输入中丢失”的情况,而非nil指向零值的指针将表示“它是零值”的情况。因此,在上面的示例中,如果string字段也可以采用空字符串值 ( ""),那么您还必须使它们成为指针。

请注意,您也可以使用自定义编组和解组逻辑来实现这一点,但这更麻烦,并且使用指针会自动为您提供这一点。