您可以使用内部联接监视rethinkdb查询的changes()吗?

时间:2015-10-11 01:09:00

标签: rethinkdb

我尝试使用连接

监控查询的更改
r.table("presence").innerJoin(r.table('authors'), function(presence, author){
  return r.expr(author('highlights')).contains(presence('name'));
}).getField('left').changes()

我收到以下错误

e: Cannot call `changes` after `concat_map` in:
r.table("presence").innerJoin(r.table("authors"), function(var_115, var_116) { return var_116("highlights").contains(var_115("name")); }).getField("left").changes()

是合法的,哪个部分是concat_map

的部分

1 个答案:

答案 0 :(得分:0)

我认为innerJoinconcat_map之上的糖语法。实际上,您始终可以使用concatMap来解决加入问题。

很遗憾,根据https://rethinkdb.com/docs/changefeeds/ruby/

,您无法在changes之后使用concatMap

我们有一个问题需要跟踪这个问题,它可能会落在2.3或2.4中,正如他们所说的那样。 https://github.com/rethinkdb/rethinkdb/issues/3997

是的,此时此changes之后您无法使用join

然而,我试图进一步研究是否可以制作出可行的东西。试试吧。

根据我的理解,您有一个presence表,您的联接实际上用作过滤器/ author. highlights包含presence.name,然后听取它的更改。如何先尝试获取更改,然后再调用filter来过滤掉数据。像这样:

r.table("presence")
  .changes()
  .map(function(change) {
    return change('new_val')
  })
  .filter(function(change) {
    return r.table('authors').filter(function(author) {
      return author('highlights').contains(change('name'))
    }).count().gt(0)
  })

请注意,此查询未进行优化。如果它适合您,我们可以继续添加索引以使其运行更快。