MongoDB in Go (golang) with mgo : How do I update a record, 找出更新是否成功并在单个原子操作中获取数据?

标签 mongodb go mgo

我在 Go 下使用 MongoDB 的 mgo 驱动程序。

我的应用程序请求一个任务(仅在 Mongo 中从名为“jobs”的集合中选择一个记录),然后将自己注册为受让人以完成该任务(对同一“job”记录的更新,将自身设置为受让人)。

该程序将在多台机器上运行,都与同一个 Mongo 通信。当我的程序列出可用任务然后选择一个时,其他实例可能已经获得了该分配,并且当前分配将失败。

如何确定我读取然后更新的记录在更新时是否具有特定值(在本例中为受让人)?

我正在尝试获得一项任务,无论是哪一项,所以我认为我应该先选择一个待处理的任务并尝试分配它,以防更新成功。

所以,我的查询应该是这样的:

“从集合 'jobs' 的所有记录中,更新 仅一个 具有 assignee=null 的记录,将我的 ID 设置为受让人。然后,给我该记录 所以我可以胜任这份工作。”

我如何使用 Go 的 mgo 驱动程序来表达这一点?

最佳答案

这是一个老问题,但万一有人还在家里看,Query.Apply 很好地支持了这个问题。方法。它确实运行 findAndModify 命令,如另一个答案中所示,但它方便地隐藏在 Go goodness 后面。

文档中的示例与此处的问题几乎完全匹配:

change := mgo.Change{
        Update: bson.M{"$inc": bson.M{"n": 1}},
        ReturnNew: true,
}
info, err = col.Find(M{"_id": id}).Apply(change, &doc)
fmt.Println(doc.N)

关于MongoDB in Go (golang) with mgo : How do I update a record, 找出更新是否成功并在单个原子操作中获取数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11417784/

相关文章:

javascript - 如何使用Mongoose查询导入的json

go - 将 url.URL 与controller-gen一起使用

mongodb - 如何表示具有混合类型的数组

json - 将 slice 结果 JSON 插入 MongoDB

ruby-on-rails - 继承的资源和 Mongoid

angularjs - router.post返回错误 "undefined is not a function"。使用mongo和express.js

mongodb - 如何删除旧版本的mongodb并在cloud9 IDE中安装新版本?

json - 向 Golang API 发送请求以发送 JSON 和字符串化 JSON

arrays - 是否可以在 Go 函数中返回结构的动态数组?

go - 如何在 mgo 中构造 $or 查询