javascript-关系数据的CouchDB MapReduce查询
作者:互联网
在开始之前,请不要告诉我使用SQL.在较大的上下文中,这是一个小问题,我不能也不想在这里使用关系数据库.我知道问题很容易用SQL解决.
共有三种类型的文档:
>玩家
>团队
>赞助商
球队属于一个赞助商,但有很多球员.一个玩家可以在多个团队中,一个赞助商可以具有多个团队.
玩家1 — N队N — 1赞助商
我将玩家文档ID放入数组的Teams文档中:
players: ["payer1","player2",...]
现在,我希望所有(特定的,只命名一次)特定球员的赞助商:
玩家1:赞助商1,赞助商2,赞助商3,…
有点像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,{}]
标签:mapreduce,nosql,couchdb,javascript 来源: https://codeday.me/bug/20191102/1987805.html