2

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

怎么做?有办法吗?

更新:

我试图更清楚地说明我为什么要问这个问题,尤其是在回复 zero.zero.seven 和 j03w 的评论时。倒不是我懒得去想一个结构,而是我想利用Mongo这个优秀的特性,灵活性。

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

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

4

1 回答 1

0

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

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

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

allow_dynamic_fields: true

read_attribute这为您提供了使用andwrite_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 文档中,甚至在模型中都没有提及。

在 mongoid 文档中查看更多信息。

于 2013-12-25T21:44:10.010 回答