CouchDB关系数据的MapReduce查询

CouchDB MapReduce query for relational data

本文关键字:MapReduce 查询 数据 关系 CouchDB      更新时间:2023-09-26

在我开始之前,请不要告诉我使用SQL。在更大的上下文中,这是一个小问题,我不能也不想在这里使用关系数据库。我知道这个问题很容易在SQL中解决。

有三种类型的文档:

    玩家
  • <
  • 团队/gh>赞助商

球队属于一个赞助商,但有许多球员。一个球员可以在多个球队,一个赞助商可以有多个球队。

玩家1—N队伍N—1赞助商

我把球员文档id放到了Teams文档的数组中:

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

现在我想要一个特定球员的所有(不同的,只命名一次)赞助商:

Player1: Sponsor1, Sponsor2, Sponsor3,…

这有点像CouchDB Wiki中的n-n示例,但由于团队玩家中有多个键,因此实际上不起作用。

我用示例数据创建了一个要点。

任何想法如何编写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,{}]