为了账号安全,请及时绑定邮箱和手机立即绑定

仅通过有效负载更新

仅通过有效负载更新

Go
呼如林 2022-04-26 14:46:33
我正在使用 go 和 echo 制作 rest API,并且正在更新数据。起初我使用 struct 来存储有效负载,然后对 mongodb 进行更新type updatePayload struct {    FullName    string `json:"fullName" bson:"fullName"`    FirstName   string `json:"firstName" bson:"firstName"`    LastName    string `json:"lastName" bson:"lastName"`    Location    string `json:"location" bson:"location"`    Gender      string `json:"gender" bson:"gender"`    State       string `json:"state" bson:"state"`    Subdistrict string `json:"subdistrict" bson:"subdistrict"`    Address     string `json:"homeAddress" bson:"homeAddress"`    Profession  string `json:"provession" bson:"provession"`    Settings    struct {        Email bool `json:"email" bson:"email"`        SMS   bool `json:"sms" bson:"sms"`        GCM   bool `json:"gcm" bson:"gcm"`    } `json:"settings" bson:"settings"`    Coordinates struct {        Type        string    `json:"type" bson:"type"`        Coordinates []float64 `json:"coordinates" bson:"coordinates"`    } `json:"coordinates" bson:"coordinates"`}更新正在工作,但如果我没有发送所有参数,例如只发送一个字段,其余字段将更新为,只是它是一个空字符串“”有什么办法我只能更新请求有效负载上指定的字段。
查看完整描述

2 回答

?
蝴蝶不菲

TA贡献1810条经验 获得超4个赞

您必须在结构上指定 omitempty


type PayloadUpdateProfile struct {

    FullName    string       `json:"fullName,omitempty" bson:"fullName,omitempty"`

    FirstName   string       `json:"firstName,omitempty" bson:"firstName,omitempty"`

    LastName    string       `json:"lastName,omitempty" bson:"lastName,omitempty"`

}

像往常一样将有效负载绑定到结构中


var payload profile.PayloadUpdateProfile

err := c.Bind(&payload)

然后转换它


var payloadInterface map[string]interface{}

    inrecPayload, _ := json.Marshal(payload)


    json.Unmarshal(inrec, &payloadInterface)


UpdateMethod(ctx, filter, payloadInterface)


查看完整回答
反对 回复 2022-04-26
?
呼唤远方

TA贡献1856条经验 获得超11个赞

你可以这样做:


    type updatePayload struct {

    FullName    string `json:"fullName" bson:"fullName"`

    FirstName   string `json:"firstName" bson:"firstName"`

    LastName    string `json:"lastName" bson:"lastName"`

    Location    string `json:"location" bson:"location"`

    Gender      string `json:"gender" bson:"gender"`

    State       string `json:"state" bson:"state"`

    Subdistrict string `json:"subdistrict" bson:"subdistrict"`

    Address     string `json:"homeAddress" bson:"homeAddress"`

    Profession  string `json:"provession" bson:"provession"`

    Settings    struct {

        Email bool `json:"email" bson:"email"`

        SMS   bool `json:"sms" bson:"sms"`

        GCM   bool `json:"gcm" bson:"gcm"`

    } `json:"settings" bson:"settings"`

    Coordinates struct {

        Type        string    `json:"type" bson:"type"`

        Coordinates []float64 `json:"coordinates" bson:"coordinates"`

    } `json:"coordinates" bson:"coordinates"`

}


func (payload *updatePayload) prepareUpdateQuery() (bson.M, error) {

    updateQuery := make(bson.M)

    if len(payload.FirstName) != 0 {

        updateQuery["firstName"] = payload.FirstName

    }


    if len(payload.LastName) != 0 {

        updateQuery["lastName"] = payload.LastName

    }

    // do same like above for other fields 


    updateQ := make(bson.M)

    updateQ["$set"] = updateQuery

    return updateQ, nil

}

在 updatePayload 结构上有方法,在解码 api 有效负载后,调用此方法并为那些仅具有来自 api 有效负载的数据的字段生成更新查询。一旦进行更新查询,将该更新查询传递给 mongodb 更新包装函数。


查看完整回答
反对 回复 2022-04-26
  • 2 回答
  • 0 关注
  • 147 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号