В списке рассылки возник вопрос о поиске по связанным объектам. В частности, сценарий — это понятие игрока и персонажей в игре MMPROG.
Вот как выглядит документ Player:
{
«Id»: «Players/[email protected]»,
«Имя»: «Белла Дона»,
«Биллинг»: [{...}, {...}],
«Взрослый»: ложь,
"LastLogin": "2015-03-11"
}
И игрок имеет несколько документов персонажа:
{
«Id»: «символов / 1234»,
«Имя»: «Черная Дона»,
«Игрок»: «Players/[email protected]»,
"Гонка": "DarkElf",
«Уровень»: 24,
«ХР»: 283831,
«HP»: 438,
"Навыки и умения": [ { ... } , { ... } ]
}
{
«Id»: «символов / 1321»,
«Имя»: «Голубой колокол»,
«Игрок»: «Players/[email protected]»,
«Гонка»: «Халфлинг»,
"Уровень 2,
«ХР»: 2831,
«HP»: 18,
"Навыки и умения": [ { ... } , { ... } ]
}
{
«Id»: «символов / 1143»,
«Имя»: «Коричневый цирюльник»,
«Игрок»: «Players/[email protected]»,
"Гонка": "WoodElf",
«Уровень»: 44,
«ХР»: 983831,
«HP»: 718,
"Навыки и умения": [ { ... } , { ... } ]
}
И то, что мы хотим, это вывод, как это
{
«Id»: «Players/[email protected]»,
«Взрослый»: ложь,
"Символы" : [
{"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)
}
Это дает вам все детали, в одном месте. И вы можете начать работать над запросами оттуда.