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)
问题:
当我第一次保存这个表单时,合适的表单值会保存到 Mongodb 中。
现在我想更新该表单并假设有一个复选框,该复选框在保存数据时已选中。更新表单时,未选中该复选框并提交表单以保存。现在因为我在结构中应用了“omitempty”标志,所以它没有将空值映射到复选框字段。由于该值未映射到结构中,因此不会保存到数据库中。
当用户第二次编辑表单时,它会看到相同的复选框被选中。(但实际上,该值应更新到数据库中,并且复选框应显示为未选中状态。)
我在 REST API 中使用相同的表单数据(JSON 格式)。在 API 中,在更新表单数据时,如果我只提到那些必需的值并且不传递我不想更新的值,那么 MongoDB 就会使用提供的必需值覆盖整个文档(即使这些值是也被覆盖,我不想更新也不想传入 API)。
要求:
将来,我想公开 REST API,所以我不希望这件事发生在那里。这就是为什么我不想从结构字段中删除“omitempty”标志。
在结构中使用 omitempty 标志时,有什么方法可以将空表单值或 API 数据字段保存到数据库中?
谢谢!
bool
type的值有 2 个可能的值:false
和true
。并且您想用一个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
字段也可以采用空字符串值 ( ""
),那么您还必须使它们成为指针。
请注意,您也可以使用自定义编组和解组逻辑来实现这一点,但这更麻烦,并且使用指针会自动为您提供这一点。