我有两个类
class Claim
include Mongoid::Document
embeds_many :claim_fields
belongs_to :user
...
end
class ClaimField
include Mongoid::Document
embedded_in :claim
field :title
field :value
...
end
我需要通过数据库获取具有当前标题的claim_fields的所有唯一值(不是通过Ruby - 对于数千条记录来说太慢了)
我已经尝试过了
user = User.find(...)
Claim.collection.distinct("claim_fields.value", {:user_id => user.id, "claim_fields.title" => some_title})
# that is the same as user.claims.find(...).distinct("claim_fields.value")
但它返回所有claim_fields值,并且我需要它仅返回具有我需要的标题的claim_fields的值。
PS 看起来我需要一些 MapReduce
最佳答案
这里的根本问题是 MongoDB 查询仅返回整个文档。您正在过滤 claim_fields.title
,但系统会返回所有匹配的 Claim
文档。
您正在执行不同
,但 MongoDB 对待子对象和文档的方式不同。因此,distinct
可能没有执行您想要的操作。
这里有两种可能的解决方案:
- 通过 M/R 预先计算。 (按照您的建议)
- 将它们分成两个集合。
关于#2,不需要像您那样嵌入对象。嵌入式应该根据您计划执行最多的查询来完成。因此,如果这是一个常见的查询,那么制作这些单独的文档是公平的。
关于ruby-on-rails - Mongoid:为适合选项的embedded_in对象返回不同的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7374686/