mongodb - 使用 FindAndModify 在官方 Mongo Go 驱动程序中运行查询

标签 mongodb go mgo mongo-go

在 Go 社区驱动的 Mongo 驱动程序(即 Mgo)中,我们可以使用 Apply API 调用来运行涉及 $set$inc< 的 MongoDB 查询。 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)

引用官方documentation对于此 API 调用:

Apply runs the findAndModify MongoDB command, which allows updating, upserting or removing a document matching a query and atomically returning either the old version (the default) or the new version of the document (when ReturnNew is true).

我目前正在从 Mgo 移植一个项目到official Mongo Go driver 。但是,我无法找到任何运行 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"}})

编辑(2020年2月29日):看起来在这个答案之后,MongoDB工程师已经更新了documentation关于正在使用的 MongoDB 功能。文档现在指出 FindOneAndUpdate 使用 findAndModify 操作。

关于mongodb - 使用 FindAndModify 在官方 Mongo Go 驱动程序中运行查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55725327/

相关文章:

http - 从 golang 中的网络调用中读取非 utf8 编码的数据

mongodb - 如何检查集合是否存在 MongoDB Golang

java - 如何使用java在这个mongodb查询中使用 HashMap 编写

mongodb - 在 docker 容器中安装 mongodb

ruby-on-rails - rails 3 : how to use active record and mongoid at the same time

mongodb - 无法使用带有 upsert 的 updateone 批量更新 mongo

我可以使用 & 运算符在函数中获取有效指针,即使该函数已在 golang 中返回

validation - gin-gonic 中的多部分文件上传验证

mongodb - Go mgo 不存储对象

mongodb - 在使用 MongoDB 和 Golang 的查找引用中获取值