Запрос CouchDB MapReduce для реляционных данных - PullRequest
3 голосов
/ 23 ноября 2011

Прежде чем я начну, пожалуйста, не говорите мне использовать SQL.Это небольшая проблема в более широком контексте, и я не могу и не хочу использовать здесь реляционную базу данных.Я знаю, что эту проблему довольно легко решить в SQL.

Существует три типа документов:

  • Игроки
  • Команды
  • Спонсоры

Команды принадлежат одному спонсору, но имеют много игроков.Игрок может состоять из нескольких команд, а спонсор может иметь несколько команд.

Игроки 1 --- N Команды N --- 1 Спонсоры

Я поместил идентификаторы документов игрока в документ Командыв массиве:

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

Теперь я хочу, чтобы все (разные, только один раз названные) спонсоры для конкретного игрока:

Игрок1: Спонсор1, Спонсор2, Спонсор3, ...

Это немного похоже на пример nn в CouchDB Wiki , но, поскольку в командных игроках есть несколько ключей, это на самом деле не работает.

Я создал с примерами данных. .

Есть идеи, как написать функцию MapReduce, чтобы получить этот результат?

Ближайшее, что я получил, но несколько раз показывает спонсоров, с уровнем группы 1:

function(doc) {
  if(doc.type == "team")
    emit(doc.players,doc.sponsor);
}
function(keys, values) {
  return (values);
}

1 Ответ

4 голосов
/ 23 ноября 2011

Вы близки со своим взглядом, здесь он немного изменен:

"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,{}] 
...