在官方 Mongo Go Driver 中使用 FindAndModify 来 运行 查询
Using FindAndModify to run queries in the official Mongo Go Driver
在社区驱动的 Mongo Go 驱动程序中,即 Mgo,我们可以使用 Apply
API 调用 运行 MongoDB 查询涉及$set
或 $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 调用引用官方 documentation:
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 to the official Mongo Go driver 移植一个项目。但是,我无法找到 运行s findAndModify 命令来实现类似用例的任何方法。要用官方驱动程序的相关方法替换 Apply API,推荐的方法是什么?
我考虑过检查现有代码中 'Update' 下的查询,并手动使用官方驱动程序中提供的 Find/Update/Replace 方法。但是,有没有更好的方法来做同样的事情?
我能够使用 FindOneAndUpdate API.
解决这个问题
它在内部使用 FindAndModify
,即使文档中没有明确提及。我在Go的Mongo驱动中模拟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 工程师更新了 documentation 关于正在使用的 MongoDB 功能。文档现在指出 FindOneAndUpdate
使用 findAndModify
操作。
在社区驱动的 Mongo Go 驱动程序中,即 Mgo,我们可以使用 Apply
API 调用 运行 MongoDB 查询涉及$set
或 $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 调用引用官方 documentation:
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 to the official Mongo Go driver 移植一个项目。但是,我无法找到 运行s findAndModify 命令来实现类似用例的任何方法。要用官方驱动程序的相关方法替换 Apply API,推荐的方法是什么?
我考虑过检查现有代码中 'Update' 下的查询,并手动使用官方驱动程序中提供的 Find/Update/Replace 方法。但是,有没有更好的方法来做同样的事情?
我能够使用 FindOneAndUpdate API.
解决这个问题它在内部使用 FindAndModify
,即使文档中没有明确提及。我在Go的Mongo驱动中模拟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 工程师更新了 documentation 关于正在使用的 MongoDB 功能。文档现在指出 FindOneAndUpdate
使用 findAndModify
操作。