javascript - 关系数据的 CouchDB MapReduce 查询

标签 javascript nosql 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,{}] 

关于javascript - 关系数据的 CouchDB MapReduce 查询,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8243931/

相关文章:

javascript - $mdDialog 使用函数关闭

ssl - 为 Hyperledger Fabric couchdb 启用 SSL

R Shiny in Memory Application 或 noSQL

nosql - 在 CQL cassandra 中使用 Where 过滤器时出现奇怪的结果

amazon-web-services - 如何在 DynamoDB 中添加列

couchdb - 拉取复制的 CouchApp

couchdb - 应用程序离线启动时的数据库复制

javascript - Bootstrap 4 Popover CSS 不动态变化

javascript - React 和 Redux this.props.posts 未定义?

javascript - 在 div、td 元素上覆盖 div "edit image"