编程语言
首页 > 编程语言> > javascript-关系数据的CouchDB MapReduce查询

javascript-关系数据的CouchDB MapReduce查询

作者:互联网

在开始之前,请不要告诉我使用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,{}] 

标签:mapreduce,nosql,couchdb,javascript
来源: https://codeday.me/bug/20191102/1987805.html