如何在Rethinkdb ReQL中使用sql的左连接和二级索引?

时间:2014-05-19 00:58:53

标签: rethinkdb

我有两个表AB我想在sql中使用left join,这意味着A的所有内容,只有B的常见内容。 我尝试使用外连接,如:

r.table("A").outerJoin(r.table("B"),function(a,b){
      return a("id")==b("anotherfield")("joinfield")
})

但由于表B中没有索引,因此查询非常慢。 查询outerjoin时如何使用二级索引?

等效sql

select * from A
left join a.id = b.other_field_join

3 个答案:

答案 0 :(得分:1)

您可以在此处执行map r.table('a').map(function(row) { return {left_row: row, right_rows: r.table('b').getAll(row('id'), {index:'idx'})}; })

答案 1 :(得分:1)

我花了很多时间尝试使用 concatMap 而不是 outerJoin 来加快结果

此处提供的示例:

https://rethinkdb.com/docs/sql-to-reql/javascript/

但是那个投掷错误:

Expected type DATUM but found SELECTION

由于执行操作而发生这种情况只需要基本数据类型而非选择结果

与我合作的解决方案:

r.table("A")
.concatMap(function(rowA) {
    .getAll(rowA("other_field_join"), {index: 'other_field_join'})
    .coerceTo('array')
    .do(function (result) {
        return r.branch(
          result.count().eq(0)
        , [{left: tableA}],
          result.map(function (rowB) {
            return {
              left:rowA, right: rowB
            };
          })
        )
    })
})

答案 2 :(得分:0)

如果要将SELECTION更改为DATUM,请更改以下

right_rows: r.table('b').getAll(row('id').coerceTo('ARRAY')

但是你打算一个人加入吗?

如果是ONE TO ONE JOIN,只需添加二级索引即可更快地获得结果。

r.table("B").indexCreate("anotherfield")

r.table("A").outerJoin(r.table("B"), function(left, right) {
  return left("id").eq(right("anotherfield"));
})