1

在社区驱动的 Go 的 Mongo 驱动程序中,即 Mgo,我们可以使用ApplyAPI 调用来运行涉及$setor的 MongoDB 查询$inc。Mgo 中此用例的示例如下:

change := mgo.Change{
    Update:    bson.M{"$set": bson.M{"phone": "+55 53 8402 8510"}},
    ReturnNew: true,
}
_, err = MongoSession.DB("test").C("people").Find(bson.M{"_id": a}).Apply(change, &result)

引用此 API 调用的官方文档

Apply 运行 findAndModify MongoDB 命令,该命令允许更新、更新插入或删除与查询匹配的文档,并自动返回文档的旧版本(默认)或新版本(当 ReturnNew 为 true 时)。

我目前正在将一个项目从Mgo移植到官方 Mongo Go 驱动程序。但是,我找不到任何运行 findAndModify 命令来实现类似用例的方法。要使用官方驱动程序中的相关方法替换 Apply API,推荐的方法是什么?

我考虑过检查现有代码中“更新”下的查询,并手动使用官方驱动程序中提供的查找/更新/替换方法。但是,有没有更好的方法来做同样的事情?

4

1 回答 1

2

我能够使用FindOneAndUpdate API 解决这个问题。

它在内部使用FindAndModify,即使文档中没有明确提及。我在 Go 的 Mongo Driver 中用来模拟 Mgo 的这个特性的代码如下:

MongoSession, err := mongo.NewClient(options.Client().ApplyURI("mongodb://localhost:27017"))
if err != nil {
    panic(err)
}
ctx, _ := context.WithTimeout(context.Background(), 10*time.Second)
err = MongoSession.Connect(ctx)
collection := MongoSession.Database("test").Collection("people")
a, err := primitive.ObjectIDFromHex("XXXXXXXXXX") //hiding hex value
b := collection.FindOneAndUpdate(ctx, bson.M{"_id": a}, bson.M{"$set": bson.M{"phone": "Replacing using the query"}})

编辑(29/02/20):看起来在这个答案之后,MongoDB 工程师已经更新了有关正在使用的 MongoDB 功能的文档。文档现在声明FindOneAndUpdate使用该findAndModify操作。

于 2019-04-17T10:39:54.170 回答