使用MongoMapper查询文档上的嵌入文档

时间:2011-05-25 16:27:36

标签: ruby mongodb mongomapper

在文档中查询嵌入文档有什么好的模式?例如,我的用户文档有一个嵌入式警报文档。如果我想看一个给定的用户是否有一个带有名字的警报,我可以用两种方式来做 - 据我所知 - 在记忆中a la

alert = current_user.alerts.select{|a| a.name == params[:name]}.first

或通过实际的文档界面a la(请注意,我不是100%确定这在语义上是有效的,但你明白了这一点):

User.where('alerts.name' => params[:name], :id => current_user.id).first

必须有更好的方法,比如

current_user.alerts.where(:name => params[:name])

也许?或者也许我只是没想到这个问题呢?

3 个答案:

答案 0 :(得分:0)

不。我认为这是动机:

在MongoMapper中,对数据库的查询始终返回根对象。允许查询返回没有父项的嵌入式文档会破坏它并使许多事情变得更复杂(如果我在嵌入式文档中调用.parent会怎样?)所以MongoMappers在简单性方面错误并且不假装事情是他们不是的东西。嵌入式文档存储在MongoDB中根文档内的数组中,因此MongoMapper为您提供了一个Ruby数组。

所以你的两种做法是做到这一点。

如果你需要一些语法,那么编写代码应该不会太难。你可以扩展数组,或者你可以编写一个插件来扩展MongoMapper的proxy for embedded docs

答案 1 :(得分:0)

我认为Mongoid支持此功能,请参阅the manual for embedded docs中的“查找”。

答案 2 :(得分:-1)

你可以这样做:

User.where('alerts.name' => params[:name], :id => current_user.id).fields(:alerts).first.alerts.select{|u| u.name == params[:name]}

User.where('alerts.name' => params[:name], :id => current_user.id).fields(:alerts).alerts.select{|u| u.name == params[:name]}.first