作者热门文章
- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
我在 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/
我是一名优秀的程序员,十分优秀!