Ark*_*jee 2 go mongodb mgo mongo-go
在社区驱动的 Go 的 Mongo 驱动程序(即 Mgo)中,我们可以使用API 调用来运行涉及或 的ApplyMongoDB 查询。Mgo 中此用例的示例如下:$set$inc
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)
Run Code Online (Sandbox Code Playgroud)
引用这个API调用的官方文档:
Apply 运行 findAndModify MongoDB 命令,该命令允许更新、更新插入或删除与查询匹配的文档,并自动返回文档的旧版本(默认)或新版本(当 ReturnNew 为 true 时)。
我目前正在致力于将一个项目从Mgo移植到官方 Mongo Go 驱动程序。但是,我无法找到任何运行 findAndModify 命令来实现类似用例的方法。如果要将Apply API替换为官方驱动程序中的相关方法,推荐的方法是什么?
我考虑过检查现有代码中“更新”下的查询,并手动使用官方驱动程序中提供的查找/更新/替换方法。但是,还有更好的方法来做同样的事情吗?
我能够使用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"}})
Run Code Online (Sandbox Code Playgroud)
编辑(2020 年 2 月 29 日):看起来在这个答案之后,MongoDB 工程师已经更新了有关正在使用的 MongoDB 功能的文档。文档现在声明FindOneAndUpdate使用该findAndModify操作。