2011-09-10 28 views
2

我有兩個班Mongoid:對(而不是由紅寶石embedded_in適合

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所有唯一值,通過分貝我要求的選擇對象返回不同的價值 - 它爲成千上萬的記錄)

太慢我已經tryied這

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_fiel值帶有我需要的標題。

PS看起來我需要一些MapReduce的這裏

回答

3

這裏的根本問題是MongoDB的查詢只返回整個文檔。您正在過濾claim_fields.title,但系統正在返回匹配的所有Claim文檔。

您正在做distinct,但MongoDB以不同的方式處理子對象和文檔。因此,distinct可能沒有達到你想要的效果。

這裏有兩個可能的解決方案:通過M/R

  1. 預先計算。 (如你所建​​議
  2. 將這些分成兩個集合。

關於#2,不需要像現在那樣嵌入對象。嵌入應根據您計劃執行的查詢來完成。所以如果這是一個普通的查詢,那麼製作這些單獨的文檔是公平的。

+0

問題是,一開始沒有任何需要通過嵌入對象查詢,但現在我們需要它 – fl00r