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

Using $setOnInsert on Upsert With mgo Driver

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

给定任意类型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 查询如下所示(其中 nowtime.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
}