草庐IT

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

coder 2023-05-01 原文

我在 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/

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

  1. ruby - 如何验证 IO.copy_stream 是否成功 - 2

    这里有一个很好的答案解释了如何在Ruby中下载文件而不将其加载到内存中:https://stackoverflow.com/a/29743394/4852737require'open-uri'download=open('http://example.com/image.png')IO.copy_stream(download,'~/image.png')我如何验证下载文件的IO.copy_stream调用是否真的成功——这意味着下载的文件与我打算下载的文件完全相同,而不是下载一半的损坏文件?documentation说IO.copy_stream返回它复制的字节数,但是当我还没有下

  2. ruby-on-rails - 将保存回调添加到单个 ActiveRecord 实例,可以吗? - 2

    是否可以为单个ActiveRecord实例添加回调?作为进一步的限制,这是继续使用库,所以我无法控制该类(除了对其进行猴子修补)。这或多或少是我想做的:defdo_something_creazymessage=Message.newmessage.on_save_call:do_even_more_crazy_stuffenddefdo_even_more_crazy_stuff(message)puts"Message#{message}hasbeensaved!Hallelujah!"end 最佳答案 你可以通过在创建对象后立

  3. ruby-on-rails - 如何找出拦截 'method_missing' 的内容 - 2

    使用Ruby1.8.6/Rails2.3.2我注意到在我的任何ActiveRecord模型类上调用的任何方法都返回nil而不是NoMethodError。除了烦人之外,这还破坏了动态查找器(find_by_name、find_by_id等),因为即使存在记录,它们也总是返回nil。不从ActiveRecord::Base派生的标准类不受影响。有没有办法追踪在ActiveRecord::Base之前拦截method_missing的是什么?更新:切换到1.8.7后,我发现(感谢@MichaelKohl)will_paginate插件首先处理method_missing。但是will_pa

  4. ruby - 是否可以从 ruby​​ 脚本返回值并在 c 或 shell 脚本中读取该值? - 2

    我们如何从ruby​​脚本返回值?#!/usr/bin/envrubya="test"a我们如何在Ubuntu终端或java或c中访问'a'的值? 最佳答案 在ruby​​/python脚本中打印你的变量,然后可以通过示例从shell脚本中读取它:#!/bin/bashruby_var=$(rubymyrubyscript.rb)python_var=$(pythonmypythonscript.py)echo"$ruby_var"echo"$python_var"注意你的ruby​​/python脚本只打印这个变量(有更多复杂的方

  5. HarmonyOS原子化服务开发相关术语 - 2

    术语中文解释Ability原子化服务帮助用户完成任务的原子化服务,和用户的意图进行关联。Fulfillment服务履行通过图标,卡片,语音等形式呈现用户意图。开发者通过接口的方式,处理用户意图,返回内容。Intent意图用于表达用户想要达成的目标或完成的任务。HUAWEIAssistant智能助手“无微不智”的个人助手,通过不断的学习用户的使用习惯,不断的为用户提供贴心的精准的便捷的个性化服务。AISearch全局搜索用户可快速搜索关键词,与之匹配的原子化服务则会出现在搜索结果中。SmartService智慧服务用户订阅原子化服务,在到达特定触发条件(时间、地点、事件)后,卡片推送至用户智能助

  6. ruby - 如何找出所有数组元素是否都符合某个条件? - 2

    我有一个大数组,我需要知道它的所有元素是否都能被2整除。我是这样做的,但是有点丑:_true=truearr.each{|e|(e%2).zero?||_true=false}if_true==true#...end如何在没有额外循环/赋值的情况下做到这一点? 最佳答案 这样就可以了。arr.all?(&:even?) 关于ruby-如何找出所有数组元素是否都符合某个条件?,我们在StackOverflow上找到一个类似的问题: https://stackov

  7. python - 为什么某些正则表达式引擎会在单个输入字符串中匹配 .* 两次? - 2

    许多正则表达式引擎在单行字符串中匹配.*两次,例如,在执行基于正则表达式的字符串替换时:根据定义,第一个匹配项是整个(单行)字符串,正如预期的那样。在许多引擎中有第二个匹配项,即空字符串;也就是说,即使第一个匹配项消耗了整个输入字符串,.*仍会再次匹配,然后匹配输入字符串末尾的空字符串。注意:要确保只找到一个匹配项,请使用^.*我的问题是:这种行为有充分的理由吗?一旦输入字符串被完全使用,我不希望再次尝试找到匹配项。除了反复试验之外,您能否从支持的文档/正则表达式方言/标准中收集到哪些引擎表现出这种行为?更新:revo'shelpfulanswer解释当前行为的方式;至于潜在的原因,请

  8. ruby-on-rails - 如何使 Rails 3 JSON 解析双引号字符串和单个数字 - 2

    背景关于json.org网站,字符串定义为"char+",其中char+是一个或多个char。char是除"或\之外的任何unicode字符。控制字符的子集是允许的,只需将它们转义即可:“foo”“2”“\\”在Javascript中,如果要解析一个字符串,需要将其括起来:"\"foo\""或'"foo"',但不是"'foo'"在Rails3中,JSONgem默认运行C或纯Ruby代码。根据接受的答案,gem解析JSON文档而不是元素。文档是键、值(对象/哈希)或值(数组)形式的集合。问题字符串假设我们要解析字符串foo,我们需要将其括为"\"foo\""或'"foo"'JSON.pa

  9. ruby-on-rails - RSpec 中单个设置的多个断言 - 2

    我想优化一些较慢的规范。此类规范的示例如下所示:require'rspec'classHeavyComputationdefcompute_resultsleep1#somethingcomputeheavyhere"verybigstring"endenddescribeHeavyComputation,'preferredstyle,butslow'dosubject{described_class.new.compute_result}it{shouldinclude'big'}it{shouldmatch'string'}it{shouldmatch/very/}#+50oth

  10. ruby - 从 ruby​​ 中的多个线程写入单个文件 - 2

    我正在尝试从多个线程写入单个文件。我遇到的问题是,在程序退出之前,我看不到任何内容被写入文件。 最佳答案 你需要file.flush来写出来。您还可以设置file.sync=true使其自动刷新。 关于ruby-从ruby​​中的多个线程写入单个文件,我们在StackOverflow上找到一个类似的问题: https://stackoverflow.com/questions/2761517/

随机推荐