Mongodb 在带有mgo驱动程序的Upsert上使用$setOnInsert

Mongodb 在带有mgo驱动程序的Upsert上使用$setOnInsert,mongodb,go,upsert,mgo,Mongodb,Go,Upsert,Mgo,对于Go MongoDB驱动程序的任何mgo变体,如何在Upsert上使用$setOnInsert 类型Foo struct{ ID bson.ObjectId`json:“\u ID,ommitempty”bson:“\u ID,ommitempty”` Bar字符串`json:“Bar”bson:“Bar”` Created*time.time`json:“Created,ommitempty”bson:“Created,ommitempty”` Modified*time.time`jso

对于Go MongoDB驱动程序的任何
mgo
变体,如何在
Upsert
上使用
$setOnInsert

类型Foo struct{
ID bson.ObjectId`json:“\u ID,ommitempty”bson:“\u ID,ommitempty”`
Bar字符串`json:“Bar”bson:“Bar”`
Created*time.time`json:“Created,ommitempty”bson:“Created,ommitempty”`
Modified*time.time`json:“Modified,ommitempty”bson:“Modified,ommitempty”`
}
以及
Upsert
选择器,用于确定这是
更新还是
插入

选择器:=bson.M{
“酒吧”:“酒吧”,
}
Upsert
仅在插入文档时插入创建日期的查询如下所示(其中
now
time.time
类型的变量):

query:=bson.M{
“$setOnInsert”:bson.M{
“创建”:&现在,
},
“$set”:Foo{
酒吧:“酒吧”,
修改:&现在,
},
}
globalsign/mgo
驱动程序中使用所有这些定义的类型和变量,整个查询由以下代码执行:

if,err:=session.DB(“test”).C(“test”).Upsert(选择器,查询);呃!=零{
//处理错误
}

对于遵循答案并出现此错误的任何人:“无法同时更新”。模型中缺少
ommitempty
,或者您可以将
“$set”:Foo[}
更改为
“$set”:bson.M{}