Статьи

Объединение связанных объектов с использованием Multi Map / Reduce

В списке рассылки возник вопрос о поиске по связанным объектам. В частности, сценарий — это понятие игрока и персонажей в игре MMPROG.

Вот как выглядит документ Player:

{
  «Id»: «Players/bella@dona.self»,
  «Имя»: «Белла Дона»,
  «Биллинг»: [{...}, {...}],
  «Взрослый»: ложь,
  "LastLogin": "2015-03-11"
}

И игрок имеет несколько документов персонажа:

{
  «Id»: «символов / 1234»,
  «Имя»: «Черная Дона»,
  «Игрок»: «Players/bella@dona.self»,
  "Гонка": "DarkElf",
  «Уровень»: 24,
  «ХР»: 283831,
  «HP»: 438,
  "Навыки и умения": [ { ... } , { ... } ]
}
{
  «Id»: «символов / 1321»,
  «Имя»: «Голубой колокол»,
  «Игрок»: «Players/bella@dona.self»,
  «Гонка»: «Халфлинг»,
  "Уровень 2,
  «ХР»: 2831,
  «HP»: 18,
  "Навыки и умения": [ { ... } , { ... } ]
}
{
  «Id»: «символов / 1143»,
  «Имя»: «Коричневый цирюльник»,
  «Игрок»: «Players/bella@dona.self»,
  "Гонка": "WoodElf",
  «Уровень»: 44,
  «ХР»: 983831,
  «HP»: 718,
  "Навыки и умения": [ { ... } , { ... } ]
}

И то, что мы хотим, это вывод, как это

{
    «Id»: «Players/bella@dona.self»,
    «Взрослый»: ложь,
    "Символы" : [
        {"Id": "characters / 1234", "Name": "Black Dona"},
        {"Id": "characters / 1321", "Name": "Blue Bell"},
        {"Id": "characters / 1143", "Name": "Brown Barberl"},
    ]
}

Теперь действительно простой способ сделать это — выполнить два запроса. Один, чтобы найти игрока, а другой, чтобы найти его персонажей. На самом деле это наиболее предпочтительный способ сделать это. Но давайте скажем, что нам нужно сделать что-то, что использует оба типа документов.

Дайте мне всех игроков, которые не являются взрослыми, например, с персонажем старше 40 лет. Чтобы сделать это, мы собираемся использовать индекс сокращения нескольких карт, чтобы объединить их вместе. Вот как это будет выглядеть:

// карта - Игроки

от игрока в docs.Players
выберите новый 
{
  Player = player.Id,
  Взрослый = игрок. Взрослый,
  Персонажи = новый объект [0]
}

// карта - символы

от персонажа в документах. Персонажи
выберите новый
{
   character.Player,
   Взрослый = ложь,
   Персонажи = новые [] 
   { 
     new {character.Id, character.Name}
   }
}

// уменьшить

из результата в результаты
Группировать результат по результату. Игрок в г
выберите новый
{
   Player = g.Key,
   Adult = g.Any (x => x.Adult),
   Characters = g.SelectMany (x => x.Characters)
}

Это дает вам все детали, в одном месте. И вы можете начать работать над запросами оттуда.