Ruby / Mongoid - 如何增加集合中的值并返回新值

时间:2017-02-13 04:24:15

标签: ruby-on-rails ruby mongodb mongoid

我正在更新一些使用相当过时的Mongoid版本的Ruby on Rails代码。我有以下代码行,它获取集合中的第一个文档,并将字段nextid递增1,然后返回新值:

surveyid = SurveyId.first.safely.inc(:nextid, 1)

我已将Mongoid更新到版本6.0.3,没有longet有safely方法。如果我只是使用:

surveyid = SurveyId.first.inc(:nextid, 1)

它有效,但inc没有返回任何内容,我不知道新值是什么。

较新的Mongoid版本中的等效代码是什么?谢谢!

2 个答案:

答案 0 :(得分:0)

您可以像这样检索值。

 surveyid = SurveyId.first.inc(:nextid, 1).nextid

答案 1 :(得分:0)

我弄明白了。我找到了一个完全符合我想要的mongoid_auto_increment的宝石。

现在我可以在我的集合中添加一个自动递增字段并完成它。此外,这个Gem的source code说明了如何增加一个值并获得新值,虽然我没有真正深入研究它,因为我决定使用gem而不是:

  def inc
    if defined?(::Mongoid::VERSION) && ::Mongoid::VERSION >= '5'
      collection.find(query).find_one_and_update({ '$inc' => { number: @step } }, new: true, upsert: true, return_document: :after)['number']
    elsif defined?(::Mongoid::VERSION) && ::Mongoid::VERSION >= '3'
      collection.find(query).modify({ '$inc' => { number: @step } }, new: true, upsert: true)['number']
    else
      opts = {
        "query"  => query,
        "update" => {"$inc" => { "number" => @step }},
        "new"    => true # return the modified document
      }
      collection.find_and_modify(opts)["number"]
    end
   end