MongoModel gem与无模式数据库

时间:2013-10-10 11:07:35

标签: ruby-on-rails mongodb schema

我在Ruby on Rails项目中使用MongoModel gem,它运行正常。只要您严格遵循模型中定义的结构,就可以正常工作,因此基本上将MongoDB用作具有模式的数据库。但是,从某种角度来看,MongoDB的一个优点是它是一个无模式数据库。我想利用它,将随机字段添加到文档中,就像在mongo shell中一样。

怎么做?有办法吗?

更新

我正在努力让我更清楚为什么要问这个问题,特别是回复来自zero.zero.seven和j03w的评论。这不是因为我懒得弄清楚一个结构,而是因为我想利用Mongo这个出色的功能和灵活性。

我之前在MS SQL和.Net上做过类似的事情。数据库的一部分的结构是在XML文件中定义的,该文件定义了表单而不是表。表单的值存储在一个垂直结构中,比如,当前项目的实例的ID和表单上字段的ID,所有整数都转到“整数”表,字符串转到“字符串” “表。这给了我灵活性:如果有人发现他们需要新的信息来完成他们的工作,他们只需编辑XML并在其中添加新字段。它们显示在表单上并存储在垂直DB结构中。但当然它也有它的缺点:更多的记录,不太清晰的数据库,表结构不能反映您的信息结构。性能,也许。

现在,只要你在Mongo控制台中玩这个,它就是小菜一碟。但是你怎么能在Rails中做到这一点?我正在寻找一个解决方案,您可以在其他地方定义结构,而不是在模型中。有些领域无处不在,当然,其中一个可能是“主题”。因此,如果受试者说“旅行”,应用程序会询问您“目的地”和“出发日期”,当它显示“日历条目”时,您将被提示“约会日期”和“参与者”。所以有一个结构,但是从一个实例到实例,从一个文档到另一个文档。

1 个答案:

答案 0 :(得分:0)

我只想关闭这个问题,所以请将其视为知识共享问题。最终的解决方案是在5-6周前从MongoModel切换到Mongoid。

Mongomodel工作得非常好,只要您对要在应用程序中管理的信息采用真正类似数据库(更不用说“遗留”)的方法,它就是一个完美的解决方案。但我无法弄清楚如何摆脱模型的结构限制。

现在Mongoid与众不同。在mongoid.yml文件中,您可以设置如下选项:

allow_dynamic_fields: true

这为您提供了read_attributewrite_attribute方法所需的自由:

# Raise a NoMethodError if value isn't set.
person.gender
person.gender = "Male"

# Retrieve a dynamic field safely.
person[:gender]
person.read_attribute(:gender)

# Write a dynamic field safely.
person[:gender] = "Male"
person.write_attribute(:gender, "Male")

瞧!您正在使用严格的模型开发MVC,但是您可以将任何字段添加到MongoDB文档中,甚至在模型中都没有提到。

查看更多in the mongoid documentation