【问题标题】:Atomic inc of multiple mongoid hash values多个 mongoid 哈希值的 Atomic inc
【发布时间】:2014-08-16 20:07:02
【问题描述】:

我有一个 Mongoid 模型,其哈希字段如下所示:

class DimensionStat
 include ::Mongoid::Document
 include ::Mongoid::Timestamps

 field :data, type: Hash

 attr_accessible :data
end

我假装在运行时用类似的东西填充数据

data: {
    'a' => 1,
    'b' => 2,
    ...
}

我需要原子地对多个键执行增量,例如:

'a' => -1,
'b' => 5

我在某处发现:

instance.collection.find(_id: my_id).update("$inc" => {'data.a' => -1,
'data.b' => 5})

会做的伎俩,但它没有,我做错了什么?

更新: 我正在使用 mongoid 3.1.6

【问题讨论】:

  • “不起作用”是什么意思?我一直在做这种事情,而且效果很好。 data 在 MongoDB 中的该文档中看起来像什么?顺便说一句,:$inc 是一个有效符号,所以如果你愿意,可以说 :$inc => { ... }
  • 无论如何,我每次都得到空哈希
  • 但是data 在 MongoDB 中的样子你尝试对它做任何事情之前呢?
  • 文档中不存在,更新该字段时没有用mongoid动态创建?
  • 不,MongoDB 不会为您自动激活哈希。你使用:$inc 来增加已经存在的东西。

标签: ruby-on-rails ruby ruby-on-rails-3 mongoid mongoid3


【解决方案1】:

.inc 方法与不存在的键完美配合,但文档不会自动从数据库中刷新。试试:

dimension_stat.inc('data.a' => -1, 'data.b' => 5)
puts dimension_stat.data['a'] # not changed
dimension_stat.reload
puts dimension_stat.data['a'] # changed

您会看到计数器发生了变化。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2016-07-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-27
    • 1970-01-01
    • 2011-05-13
    相关资源
    最近更新 更多