基本上我希望通过给定完全结构接口作为 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
}
感谢您的帮助
提前致谢
答案 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)
这将仅更新提供的字段。