Mongoid:为适合选项的embedded_in对象返回不同的值

时间:2011-09-10 21:00:25

标签: ruby-on-rails ruby mongodb mongoid

我有两个班级

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

1 个答案:

答案 0 :(得分:3)

这里的根本问题是MongoDB查询只返回整个文档。您正在claim_fields.title上过滤,但系统正在返回所有匹配的Claim个文档。

您正在执行distinct,但MongoDB以不同方式处理子对象和文档。结果,distinct可能没有达到您想要的效果。

这里有两种可能的解决方案:

  1. 通过M / R预先计算。 (如你所知
  2. 将这些分为两个系列。
  3. 关于#2,不需要像你一样嵌入对象。嵌入应该基于您计划执行最多的查询来完成。因此,如果这是一个常见的查询,那么制作这些单独的文档是公平的。