0

在 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. 在这些情况下,使用合并的性能是否比使用 eqJoin (concatMap) 差得多?

非常感谢。

4

1 回答 1

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

  2. 是的,应该是。

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

于 2015-09-19T17:10:12.613 回答