执行嵌套 concatMap 以实现连接多个表的最佳方法是什么?
How's the best way to perform a nested concatMap to achieve joining multiple tables?
在 RethinkDB 网站的 concatMap api 页面上,它说 eqJoin 是用 concatMap + getAll 实现的,它应该提供比其他连接更好的性能。
在我的例子中,我想连接多个表,这是一个例子,假设我有 3 个表,users
、departments
和 companies
。在每个 user
文档中都会包含一个 department id
和 company 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 }
})
})
我的问题:
- 有更好的方法吗?
- 上述查询的性能是否仍然与 2 个表上的 eqJoin 一样好?
- 在这些情况下使用 merge 的性能是否比使用 eqJoin (concatMap) 差很多?
非常感谢。
这对我来说似乎是最好的方法。如果你愿意,你可以将第二个 concatMap
移到第一个 .concatMap
中(这样你就可以将它链接到 getAll
的末尾)。那可能会更快,您必须对其进行基准测试才能发现,但它的速度应该大致相同。
是的,应该是。
我认为您不能使用合并来完成此任务。任何时候你想把一个输入行变成多个输出行,你需要使用 concatMap
或连接。如果不是每个 user/company/department 对一个输出文档,你想要每个用户一个输出文档,其中包含公司和部门的数组,那么 merge
可以用于此并且应该大致相同的速度(或者如果稍微快一点)。
在 RethinkDB 网站的 concatMap api 页面上,它说 eqJoin 是用 concatMap + getAll 实现的,它应该提供比其他连接更好的性能。
在我的例子中,我想连接多个表,这是一个例子,假设我有 3 个表,users
、departments
和 companies
。在每个 user
文档中都会包含一个 department id
和 company 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 }
})
})
我的问题:
- 有更好的方法吗?
- 上述查询的性能是否仍然与 2 个表上的 eqJoin 一样好?
- 在这些情况下使用 merge 的性能是否比使用 eqJoin (concatMap) 差很多?
非常感谢。
这对我来说似乎是最好的方法。如果你愿意,你可以将第二个
concatMap
移到第一个.concatMap
中(这样你就可以将它链接到getAll
的末尾)。那可能会更快,您必须对其进行基准测试才能发现,但它的速度应该大致相同。是的,应该是。
我认为您不能使用合并来完成此任务。任何时候你想把一个输入行变成多个输出行,你需要使用
concatMap
或连接。如果不是每个 user/company/department 对一个输出文档,你想要每个用户一个输出文档,其中包含公司和部门的数组,那么merge
可以用于此并且应该大致相同的速度(或者如果稍微快一点)。