执行嵌套 concatMap 以实现连接多个表的最佳方法是什么?

How's the best way to perform a nested concatMap to achieve joining multiple tables?

在 RethinkDB 网站的 concatMap api 页面上,它说 eqJoin 是用 concatMap + getAll 实现的,它应该提供比其他连接更好的性能。

在我的例子中,我想连接多个表,这是一个例子,假设我有 3 个表,usersdepartmentscompanies。在每个 user 文档中都会包含一个 department idcompany id。例如:

var user = {
  name: 'Peter',
  company: '12345',
  department: '8888',
  otherDetails: 'abc 123'
}

我想在连接查询后得到的结果与 concatMap/eqJoin 的结果非常相似,但所有 3 个表:

[{
  user: {...},
  company: {...},
  department: {...}
}, ...]

这是我写的一个查询,可以得到结果:

r.table('users')
  .concatMap(function(user) {
    return r.table("companies").getAll(
      user("company")
    ).map(function(company) {
      return { user: user, company: company }
    })
  })
  .concatMap(function(row) {
    return r.table("departments").getAll(
      row("user")("department")
    ).map(function(department) {
      return { user: row("user"), company: row("company"), department: department }
    })
  })

我的问题:

  1. 有更好的方法吗?
  2. 上述查询的性能是否仍然与 2 个表上的 eqJoin 一样好?
  3. 在这些情况下使用 merge 的性能是否比使用 eqJoin (concatMap) 差很多?

非常感谢。

  1. 这对我来说似乎是最好的方法。如果你愿意,你可以将第二个 concatMap 移到第一个 .concatMap 中(这样你就可以将它链接到 getAll 的末尾)。那可能会更快,您必须对其进行基准测试才能发现,但它的速度应该大致相同。

  2. 是的,应该是。

  3. 我认为您不能使用合并来完成此任务。任何时候你想把一个输入行变成多个输出行,你需要使用 concatMap 或连接。如果不是每个 user/company/department 对一个输出文档,你想要每个用户一个输出文档,其中包含公司和部门的数组,那么 merge 可以用于此并且应该大致相同的速度(或者如果稍微快一点)。