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

问题描述 投票:0回答:2

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

nextid
加 1,然后返回新值:

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

我已将 Mongoid 更新到版本 6.0.3,该版本不再有

safely
方法。如果我只是使用:

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

它有效,但是

inc
不返回任何内容,我不知道新值是什么。

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

ruby-on-rails ruby mongodb mongoid
2个回答
1
投票

对于较新版本的 Mongoid (7+):

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

inc
操作成功时返回更新后的对象。


0
投票

我明白了这一点。我发现了一个完全符合我想要的功能的 gem,名为 mongoid_auto_increment

现在我只需向我的集合添加一个自动递增字段即可完成。另外,这个 Gem 的源代码说明了如何增加值并获取新值,尽管我并没有真正深入研究它,因为我只是决定使用 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
© www.soinside.com 2019 - 2024. All rights reserved.