【发布时间】:2016-07-19 08:50:15
【问题描述】:
我在 Rails 项目(均为 4.0.x)中使用 Mongoid,并且我有一个包含存储一些无模式数据的哈希字段的文档。
class Thing
field :name, type: String
field :mass, type: Integer
field :info, type: Hash
end
通过此设置,我可以查询具有 :endDate 键的事物,例如:
Thing.where("info.endDate"=>{'$exists'=>true})
这一切都很好,很方便。为这个 :info 字段使用哈希字段很好,因为我要存储的内容没有固定的架构,并且因一件事而异。
好的,但是,我不能对 :info 哈希中的 $set 键/值对使用相同的点语法。 [1]
thing.set("info.endDate"=>Time.now)
引发Mongoid::Errors::UnknownAttribute 错误。
它告诉我我必须在我的模型中包含Mongoid::Attributes::Dynamic 才能做到这一点,但这对我来说似乎不正确。 The point of the hash field type 似乎允许您使用没有固定架构的数据。我似乎不必包含一个特殊的“动态属性”模块来使用哈希字段。
所以现在,我正在使用常规的旧 [] 语法更新值,然后在模型上调用 save,如下所示:
thing.info[:endDate] = Time.now
thing.save
但很多时候,如果只使用 $set 值会更好。是否有其他语法用于设置哈希字段值?我对上述错误消息和动态属性有误吗?我现在是否坚持对哈希字段进行两步更新?
[1] 诚然,我最近从 mongomapper 迁移过来,因此我对这种语法的期望部分是因为之前在 mongomapper 中能够做到这一点。
【问题讨论】:
-
我认为定义为 Mongoid::Attributes::Dynamic 的 embeds_one 对你有用(从未测试过这种方法)
-
我不想要嵌入文档。我想要一个哈希字段,因为我存储在那里的数据因文档而异。 mongoid 给了我一种方法来查询该哈希中的特定键/值对。我希望能够使用 $set 轻松更新该哈希中的键/值对。
-
不应该是
.set(:info => {:endDate => Time.now })不过我已经有一段时间没有使用MongoDB了。 -
@AndyGauge 将覆盖整个
:info字段,而不仅仅是将一个键写入哈希 :-)
标签: ruby-on-rails mongodb mongoid mongoid4