gpt4 book ai didi

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

转载 作者:IT王子 更新时间:2023-10-29 00:44:49 28 4
gpt4 key购买 nike

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

简介:

所有表单字段值都以 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"`
}

问题:

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

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

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

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

要求:

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

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

谢谢!

最佳答案

bool 类型的值有 2 个可能的值:falsetrue。并且您想使用 bool 字段“传达”3 种不同的状态,即不更新字段、将字段设置为 false 以及将字段设置为 。这显然是不可能的。

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"`
}

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

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

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

请注意,您也可以使用自定义编码和解码逻辑来实现此目的,但这比较麻烦,使用指针可以自动完成此操作。

关于json - 如何在 Golang 结构中使用 omitempty 标志更新 Mongodb 字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47158987/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com