我在Ruby on Rails项目中使用MongoModel gem,它运行正常。只要您严格遵循模型中定义的结构,就可以正常工作,因此基本上将MongoDB用作具有模式的数据库。但是,从某种角度来看,MongoDB的一个优点是它是一个无模式数据库。我想利用它,将随机字段添加到文档中,就像在mongo shell中一样。
怎么做?有办法吗?
更新
我正在努力让我更清楚为什么要问这个问题,特别是回复来自zero.zero.seven和j03w的评论。这不是因为我懒得弄清楚一个结构,而是因为我想利用Mongo这个出色的功能和灵活性。
我之前在MS SQL和.Net上做过类似的事情。数据库的一部分的结构是在XML文件中定义的,该文件定义了表单而不是表。表单的值存储在一个垂直结构中,比如,当前项目的实例的ID和表单上字段的ID,所有整数都转到“整数”表,字符串转到“字符串” “表。这给了我灵活性:如果有人发现他们需要新的信息来完成他们的工作,他们只需编辑XML并在其中添加新字段。它们显示在表单上并存储在垂直DB结构中。但当然它也有它的缺点:更多的记录,不太清晰的数据库,表结构不能反映您的信息结构。性能,也许。
现在,只要你在Mongo控制台中玩这个,它就是小菜一碟。但是你怎么能在Rails中做到这一点?我正在寻找一个解决方案,您可以在其他地方定义结构,而不是在模型中。有些领域无处不在,当然,其中一个可能是“主题”。因此,如果受试者说“旅行”,应用程序会询问您“目的地”和“出发日期”,当它显示“日历条目”时,您将被提示“约会日期”和“参与者”。所以有一个结构,但是从一个实例到实例,从一个文档到另一个文档。
答案 0 :(得分:0)
我只想关闭这个问题,所以请将其视为知识共享问题。最终的解决方案是在5-6周前从MongoModel切换到Mongoid。
Mongomodel工作得非常好,只要您对要在应用程序中管理的信息采用真正类似数据库(更不用说“遗留”)的方法,它就是一个完美的解决方案。但我无法弄清楚如何摆脱模型的结构限制。
现在Mongoid与众不同。在mongoid.yml
文件中,您可以设置如下选项:
allow_dynamic_fields: true
这为您提供了read_attribute
和write_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文档中,甚至在模型中都没有提到。