2011-11-23 103 views
3

在我開始之前,請不要告訴我使用SQL。這是一個更大範圍內的小問題,我不能也不想在這裏使用關係數據庫。我知道這個問題在SQL中很容易解決。CouchDB MapReduce查詢關係數據

有三種類型的文件:

  • 玩家
  • 贊助商

隊屬於一個贊助商,但有很多玩家。一名球員可以有多支球隊,而一名贊助者可以有多支球隊。

玩家1 ---ň隊ñ--- 1個贊助

我把玩家文檔ID到小組文件中的數組:

players: ["payer1","player2",...] 

現在我想所有(不同,只命名一次)贊助商爲特定球員:

PLAYER1:Sponsor1,Sponsor2,Sponsor3,...

它在CouchDB Wiki有點像NN的例子,但小號因爲隊員中有多個鍵,這不起作用。

我創建了一個gist with example data.

任何想法如何編寫MapReduce函數來獲得此結果?

我得到的最接近,但節目贊助商多次,組級1:

function(doc) { 
    if(doc.type == "team") 
    emit(doc.players,doc.sponsor); 
} 
function(keys, values) { 
    return (values); 
} 
+0

可能是有用的? http://stackoverflow.com/questions/5511810/couchdb-view-equivalent-of-sum-group-by – ajreal

回答

4

你接近你的觀點,這是略作修改:

"playerSponsers": { 
     "map": "function(doc) { 
       if(doc.type == "team" && doc.players) { 
        for (i in doc.players) { 
         emit([doc.players[i], doc.sponsor],1); 
        } 
       } 
       }", 
     "reduce": "_sum" 
    } 

這裏是查詢:

http://localhost:5984/test/_design/sports/_view/playerSponsors?group=true&group_level=2 

您會得到如下結果:

{"rows":[ 
{"key":["Player1","Sponsor1"],"value":1}, 
{"key":["Player1","Sponsor2"],"value":1}, 
{"key":["Player1","Sponsor3"],"value":1}, 
{"key":["Player2","Sponsor1"],"value":1}, 
{"key":["Player2","Sponsor2"],"value":2}, 
{"key":["Player2","Sponsor3"],"value":1} 
]} 

如果你想獲得只是一個球員的贊助商,您可以查詢這樣

http://localhost:81/test/_design/sports/_view/playerSponsors?group=true&group_level=2&startkey=[%22Player1%22]&endkey=[%22Player1%22,{}] 
+0

太棒了,非常感謝你! – Patrick