ruby - mongoid 中的嵌入式文档与哈希数据类型

标签 ruby mongodb mongoid

我找不到任何关于此的博客文章或文档。它们都是嵌入式文档和散列数据类型,非常相似。各自的优势或限制是什么?

考虑一下我的架构设计:

class HistoryTracker
  include ::Mongoid::Document
  include ::Mongoid::Timestamps

  field :modifier,          type: Hash,    default: {}
  field :original,          type: Hash,    default: {}
  field :modified,          type: Hash,    default: {}
  field :changeset,         type: Hash,    default: {}
end

我应该在这个 HistoryTracker 类中创建几个嵌入式文档吗?或者只是使用它?索引怎么样?

最佳答案

Mongoid 在数据库级别以几乎相同的方式存储嵌入式文档和 Hash 属性。使用 mongoid 在模型中声明字段时这是正常的,因此如果您有嵌套结构,则创建嵌入式文档是正常的。因为 MongoDB 是无模式的 mongoid 需要您声明字段才能以与 ActiveRecord 相同的 API 呈现它们。但对于某些用例,Hash 属性为您提供了更多的灵 active 。这种灵 active 的缺点是您受限于 Hash API,因此您无法获得自动生成的属性方法,并且您无法像通常在模型类中那样封装业务逻辑。

例如,假设您有一个问卷模型,您需要在其中存储许多包含许多问答对的部分。如果系统的关键要求是管理员能够设置新的部分和问题,那么您将无法轻松地将答案建模为包含每个问题的明确字段的常规嵌入式文档。对于这种事情,哈希可能更有意义。

我不知道您的具体要求是什么,但作为粗略的指导,我会说,当您使用带有嵌入式文档的固定模式时,但当您需要开放式模型时,请考虑哈希属性。

关于ruby - mongoid 中的嵌入式文档与哈希数据类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15515053/

相关文章:

ruby - Mongoid 删除文档匹配ID

ruby-on-rails - Mongoid,调用 update_attributes 两次以保持更改

ruby-on-rails - Mongoid 更新查询将其他属性设置为 nil?

html - 在 Ruby 中删除特定的 HTML 元素

ruby - URI 响应代码

Ruby:FileUtils.cp 截断文件; FileUtils.mv 没有吗?

mongodb - MongoDb 聚合中的条件展开?

ruby - 使用 nils 遍历 ruby​​ 嵌套哈希?

java - 使用 Spring MongoTemplate 在 mongo 中插入数据时获取 java.lang.NoSuchMethodError : org. springframework.cglib.core.ReflectUtils.defineClass

mongodb在更新中设置null