gpt4 book ai didi

mongodb - 跳过绑定(bind) ID,但将其作为响应返回

转载 作者:行者123 更新时间:2023-12-01 22:20:25 27 4
gpt4 key购买 nike

我有一个 Person 结构如下:

type Person struct {
ID primitive.ObjectID `bson:"_id,omitempty" json:"id"`
HomeAddress Address `bson:"home_address" json:"home_address"`
Pets []*struct {
ID string `json:"id"`
Name string `json:"name"`
Species string `json:"species"`
} `json:"items"`
}
这个人的 ID 是在 mongodb 中自动生成的。一个人可能拥有在后端使用 UUID 生成的 ID 的宠物。所以用户发送的 JSON 不应该包含 Person 的 ID 和每只宠物的 ID。
我在接收用户发送的 json 时使用此结构,将数据保存到我的 mongodb,并在我的处理程序中将其作为响应返回,如下所示:
PersonPostResponse struct {
models.Person
ServerTime time.Time `json:"server_time"`
EditFlag bool `json:"edit_locked"`
}

// handler of POST /person

return func(c *gin.Context) {
newPerson := models.Person{}
if err := c.shouldBindJSON(&newPerson); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
if _, err := (*repo).SavePersonData(c, &newPerson); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
c.JSON(http.StatusOK, PersonPostResponse{newPerson, time.Now(), false})
}
问题是,当我尝试发送人员 ID 为 24 个字符的 JSON 时,它被接受并保存到 mongodb。我试着把这个链接的建议 https://github.com/gin-gonic/gin/pull/1733
ID primitive.ObjectID `bson:"id,omitempty" json:"-" binding:"-"`
但 POST 响应结果不包括新创建的 Person 的 ID。
如何在绑定(bind)时跳过 Person 的 ID 和 pets 的 ID 但将其作为响应返回?
将相同的结构用于 3 个不同的目的不是一个好习惯吗?实际上,我有 17 个 JSON 字段,我不确定将它们重写 3 次是否好。

最佳答案

这可以通过多种方式处理。一种方法是拆分结构以支持不同的 View :

// Use this variant as the Person without ID
type Person struct {
// All person fields, except the ID
}

// Use this variant for DB operations and when you need ID
type DBPerson struct {
ID primitive.ObjectId
Person `bson:",inline"`
}
另一种有时更简单的处理方法是,在绑定(bind)用户后,手动清除收到的 ID:
  newPerson := models.Person{}
if err := c.shouldBindJSON(&newPerson); err != nil {
c.JSON(http.StatusBadRequest, gin.H{"error": err.Error()})
return
}
newPerson.ID=primitive.NilObjectID
或者,如果它是非空的,你也可以给出一个错误。

关于mongodb - 跳过绑定(bind) ID,但将其作为响应返回,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63930153/

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