在我开始之前,请不要告诉我使用 SQL。在更大的上下文中这是一个小问题,我不能也不想在这里使用关系数据库。我知道这个问题在 SQL 中很容易解决。
文档分为三种类型:
- 球员
- 团队
- 赞助商
球队属于一个赞助商,但有很多球员。一个选手可以在多个团队中,一个赞助商可以有多个团队。
选手 1 --- N 队 N --- 1 赞助商
我将播放器文档 ID 放入数组中的 Teams 文档中:
players: ["payer1","player2",...]
现在我想要特定球员的所有(不同的,只命名一次)赞助商:
玩家 1:赞助商 1、赞助商 2、赞助商 3、...
有点像CouchDB Wiki中的n-n例子, 但由于团队成员中有多个键,所以这实际上不起作用。
我创建了一个 gist with example data. .
知道如何编写 MapReduce 函数来得到这个结果吗?
我得到的最接近的,但多次显示赞助商,组级别 1:
function(doc) {
if(doc.type == "team")
emit(doc.players,doc.sponsor);
}
function(keys, values) {
return (values);
}
最佳答案
你的观点很接近,这里稍微修改一下:
"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,{}]
关于javascript - 关系数据的 CouchDB MapReduce 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243931/