2012-04-13 47 views
0

我在創建mapreduce算法時遇到問題,該算法將獲取我需要的統計信息。我有一個可以創建帖子的用戶對象,而其他用戶可以有很多喜歡的帖子。未嵌入子對象的MapReduce

用戶
--Post
----喜歡

崗位沒有嵌入用戶,因爲我們只是在用戶上下文分開,而不是訪問的職位。我需要的數據是作者獲得的喜歡數量,我需要通過用戶的帖子來獲得這個數字。問題是,因爲帖子沒有嵌入,我無法在我的地圖功能中訪問它們。這裏有地圖和減少功能,我現在有

def reputation_map 
<<-MAP 
    function() {  
     var posts = db.posts.find({user_id:this._id}); 
     emit(this._id, {posts:posts});  
    } 
MAP 
end 

def reputation_reduce 
    <<-REDUCE 
    function(key, values) { 
     var count = 0; 
     while(values.hasNext()){ 
     values.next(); 
     count+=1; 
     } 
     return {posts:count}; 
    } 
REDUCE 
end 

這應該只返回崗位爲每個用戶,所以我還沒有算到了喜歡平又而是計數的,這個只返回職位的DBQuery 。這樣做的正確方法是什麼?

+0

按user_id計算點贊數(在Post中)。然後,如有必要,將這些user_ids映射到用戶(在單獨的查詢中)。 – 2012-04-13 15:43:44

+0

我不確定如何在mapreduce中查詢它們,因爲它們沒有嵌入。 – Slick86 2012-04-13 15:56:10

+0

對帖子進行map-reduce,而不是用戶。然後,在單獨的查詢中(不是map-reduce)獲取擴展用戶信息(如果需要)。 – 2012-04-13 15:58:08

回答

1

地圖Reduce實際上是一次設計用於一次收集的。

從技術上講,您可以從Map函數中查詢單獨的集合,因爲您已經完成了這項工作,但請小心,因爲這不是建議也不支持。你可能會遇到問題,特別是如果收集分解。

類似的問題被問了一段時間後:How to call to mongodb inside my map/reduce functions? Is it a good practice?

如果你是聚合來自多個集合的結果,你可能會發現,最安全和最直接的方式做到這一點是在應用程序中。或者,如果每個作者的喜歡是一個將以某個頻率進行搜索的值,則最好將其作爲每個文檔中的值包含在內,並且在每次更新時花費更多的開銷來增加此值,而不是定期對每個作者的所有投票執行潛在的資源大量計算。

希望這會給你一些思考的食物來檢索你需要的值。

如果您希望爲單個集合編寫Map Reduce操作提供一些幫助,社區將隨時爲您提供幫助。請包括一個示例輸入文檔,以及所需輸出的描述。

有關地圖的更多信息減少,文檔可以在這裏找到: http://www.mongodb.org/display/DOCS/MapReduce

此外,有一些很好的Map Reduce例子MongoDB的食譜: http://cookbook.mongodb.org/

的 「其他」 部分食譜文章「使用版本化文檔查找最大值和最小值」http://cookbook.mongodb.org/patterns/finding_max_and_min/包含了Map Reduce操作的逐步演練,解釋了函數的執行方式。