2013-02-13 97 views
0

我在使用Mongoid和MongoDB創建應用程序。我有了一個輪廓像這樣一個用戶:Mongoid Map使用has_one減少

class User 

field :email, :type => String 
field :name, :type => String 
field :date_of_birth, :type => DateTime 
has_one :profile 

end 

class Profile 

field :votes, :type => Hash 
field :biography, :type => String 
belongs_to :profile 

end 

的票散的結構,像這樣:

profile : { 
    "user_id" : ObjectId("511b76b0e80c505750000031"), 
    "votes": { 
    "vote_count": 3, 
    "up_votes": 3, 
    "down_votes": 0 
    } 
} 

我運行圖減少,像這樣:

map = " 
    function() { 
    values = { 
     name: this.name 
    } 
    emit(this._id, values); 
    } 
" 

reduce = " 
    function (key, emits) { 
    return emits; 
    } 
" 

User.map_reduce(map, reduce).out(replace: "leaderboards").each do |document| 
    ap document 
end 

該作品罰款並在Mongo中創建一個名爲排行榜的新集合。不過,我試圖從配置文件中映射一些數據,因此它包含配置文件中的vote_count字段。

從根本上讓我的地圖功能看起來像這樣:

map = " 
    function() { 
    values = { 
     name: this.name, 
     votes: this.profile.votes.vote_count 
    } 
    emit(this._id, values); 
    } 
" 

但是我有困難拿到與用戶相關的配置文件。有誰知道我如何從用戶配置文件中提取數據?

如果有什麼不明白的地方讓我知道。任何幫助,將不勝感激。

託尼

回答

1

存在的MongoDB沒有辦法的事「加入」從服務器端的不同集合的數據 - 你必須做他們在您的客戶端應用程序,或者更好的,考慮document embedding,尤其是在目前是您的用戶和個人資料集合之間的1:1關係。現在

,如果設計變化是不是一種選擇,你可以按順序執行兩個MapReduce的():

  1. 一個你有用戶,但使用USER_ID爲重點,並添加名稱 作爲現場
  2. 在檔案MapReduce的具有相同USER_ID鍵和 vote_count,指定merge output到您的排行榜 收集

這是否幫助?

問候

羅納德