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

Bra*_*ler 6 ruby mongodb mongomapper

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

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

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

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

必须有更好的方式,比如

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

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

Bri*_*pel 0

没有。我认为这就是动机:

在 MongoMapper 中,对数据库的查询总是返回一个根对象。允许查询返回没有其父级的嵌入式文档将是一种突破,并使很多事情变得更加复杂(如果我在该嵌入式文档中调用 .parent 会怎样?),因此 MongoMappers 在简单性方面犯了错误,并且不会假装事物并非如此。嵌入式文档存储在 MongoDB 中根文档内的数组中,因此 MongoMapper 为您提供了 Ruby 中的数组。

所以你的两种做法是预期的做法。

如果您需要一些语法糖,那么编写代码应该不会太难。您可以扩展 Array 或者编写一个插件来扩展 MongoMapper 的嵌入式文档代理