使用 Multi Map/Reduce 合并相关实体

一则或许对你有用的小广告

欢迎加入小哈的星球 ,你将获得:专属的项目实战 / 1v1 提问 / Java 学习路线 / 学习打卡 / 每月赠书 / 社群讨论

  • 新项目:《从零手撸:仿小红书(微服务架构)》 正在持续爆肝中,基于 Spring Cloud Alibaba + Spring Boot 3.x + JDK 17...点击查看项目介绍 ;
  • 《从零手撸:前后端分离博客项目(全栈开发)》 2 期已完结,演示链接: http://116.62.199.48/ ;

截止目前, 星球 内专栏累计输出 54w+ 字,讲解图 2476+ 张,还在持续爆肝中.. 后续还会上新更多项目,目标是将 Java 领域典型的项目都整一波,如秒杀系统, 在线商城, IM 即时通讯,权限管理,Spring Cloud Alibaba 微服务等等,已有 1900+ 小伙伴加入学习 ,欢迎点击围观

邮件列表中出现了一个关于跨相关实体搜索的问题。特别是,场景是 MMPROG 游戏中玩家和角色的概念。

播放器文档如下所示:

 {
  "Id": "players/bella@dona.self",
  “名称”:“贝拉多娜”,
  “计费”:[{...},{...}],
  “成人”:假的,
  “上次登录”:“2015-03-11”
}

而一个玩家有多个角色文件:

 {
  "Id": "字符数/1234",
  “名称”:“黑多纳”,
  “玩家”:“玩家/bella@dona.self”,
  “种族”:“黑暗精灵”,
  “等级”:24,
  “经验值”:283831,
  “生命值”:438,
  “技能”:[ { ... } , { ... } ]
}
 {
  "Id": "字符数/1321",
  “名称”:“蓝铃”,
  “玩家”:“玩家/bella@dona.self”,
  “种族”:“半身人”,
  “级别”:2,
  “经验值”:2831,
  “惠普”:18,
  “技能”:[ { ... } , { ... } ]
}
 {
  "Id": "字符数/1143",
  “名称”:“棕色理发师”,
  “玩家”:“玩家/bella@dona.self”,
  “种族”:“木精灵”,
  “等级”:44,
  “经验值”:983831,
  “生命值”:718,
  “技能”:[ { ... } , { ... } ]
}

我们想要的是这样的输出:

 {
    “ID”:“玩家/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, 成人 = player.Adult, 字符 = 新对象[0] }

// 地图 - 字符

来自 docs.Characters 中的字符 选择新的 { character.Player, 成人 = 假, 字符=新[] { 新的 { 字符.Id, 字符.Name } } }

// 减少

从结果到结果 按 result.Player 将结果分组为 g 选择新的 { 玩家 = g.Key, 成人 = g.Any(x=>x.Adult), 字符 = g.SelectMany(x=>x.Characters) }

这会在一个地方为您提供所有详细信息。您可以从那里开始处理查询。