我有两个班级
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
我需要通过db获取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
答案 0 :(得分:3)
这里的根本问题是MongoDB查询只返回整个文档。您正在claim_fields.title
上过滤,但系统正在返回所有匹配的Claim
个文档。
您正在执行distinct
,但MongoDB以不同方式处理子对象和文档。结果,distinct
可能没有达到您想要的效果。
这里有两种可能的解决方案:
关于#2,不需要像你一样嵌入对象。嵌入应该基于您计划执行最多的查询来完成。因此,如果这是一个常见的查询,那么制作这些单独的文档是公平的。