不能在Mongo记录[mgo]:golang的struct接口上只突发一个值

时间:2018-03-15 07:18:50

标签: mongodb go mgo

基本上我希望通过给定完全结构接口作为 collection.Upsert(选择器,更改)中的更改参数来更新mongodb文档中的一个值。我们如何做到这一点,而不会失去其他值为空。其他(type,category.rerportby,createon,info)值应保留在现有值上,只将 plant location 值更新为 PLANT07 BAR

  

注意:我想使用完全服务通知结构对象   这样做。

DatabaseName:WO 
CollectionName:SERVICE_NOTIFICATIONS

包装模型

//models.ServiceNotification
type ServiceNotification struct {
    NotificationNo string                `json:"notification_no" bson:"notification_no"`
    Type           string                `json:"type" bson:"type"`
    Category       string                `json:"category" bson:"category"`
        Plant          string                `json:"plant" bson:"plant"`
    Location         string              `json:"location" bson:"location"`
    ReportedBy     string                `json:"reportedby" bson:"reportedby"`
    Info           map[string]interface{}`json:"info" bson:"info"`
    SAPInfo        SAPNotificationInfo   `json:"sapinfo" bson:"sapinfo"`
        CreateOn       string                `json:"createon" bson:"createon"`
    UpdateOn       string                `json:"updateon" bson:"updateon"`
}

package main

func main(){

input := models.ServiceNotification{
    NotificationNo:000120,
    Plant:"Plant07",
    Location:"BAR",
}
Change_ServiceNotification(input)

}
  

我希望通过给mongo Upsert函数提供完整的struct接口来更新工厂和位置。因为我想动态决定应该做什么   更新。但是,当我更新工厂和位置其他值时    LOST 。在mongo记录中。

func Change_ServiceNotification(notification models.ServiceNotification) error {
    session, err := commons.GetMongoSession()
    if err != nil {
        return errors.New("Cannot create mongodb session" + err.Error())
    }
    defer session.Close()
    var col = session.DB(WO).C(SERVICE_NOTIFICATIONS)

    selector := bson.M{"notification_no": notification.NotificationNo}

    _, err = col.Upsert(selector, notification)
    if err != nil {
        errMsg := "Cannot update service notification " + err.Error()
        return errors.New(errMsg)
    }
    return nil
}

感谢您的帮助

提前致谢

1 个答案:

答案 0 :(得分:0)

你不能这样做,但你可以使用MongoDB的$ set运算符(跳过错误检查):

input := Bson.M{
    "$set": bson.M{
        "plant": "Plant07",
        // Further fields here...
    }
}
selector := bson.M{"notification_no": notification.NotificationNo}
col.Upsert(selector, input)

这将仅更新提供的字段。