С учетом произвольного типа Foo
:
type Foo struct {
ID bson.ObjectId `json:"_id,omitempty" bson:"_id,omitempty"`
Bar string `json:"bar" bson:"bar"`
Created *time.Time `json:"created,omitempty" bson:"created,omitempty"`
Modified *time.Time `json:"modified,omitempty" bson:"modified,omitempty"`
}
И селектор Upsert
, который определяет, будет ли это Update
или Insert
:
selector := bson.M{
"bar": "bar",
}
Запрос Upsert
на вставку созданной даты, только если документ вставляется, будет выглядеть следующим образом (где now
- это переменная типа time.Time
):
query := bson.M{
"$setOnInsert": bson.M{
"created": &now,
},
"$set": Foo{
Bar: "bar",
Modified: &now,
},
}
Используя все эти определенные типы и переменные с драйвером globalsign/mgo
, весь этот запрос выполняется с помощью следующего кода:
if _, err := session.DB("test").C("test").Upsert(selector, query); err != nil {
// Handle error
}