加入rethinkdb

Joins in rethinkdb

我在 RethinkDB table 中存储了以下数据结构:

{
   id: string,
   parentId: string,
   timestamp: number,
   data: Object
}

这个数据结构形成了一棵树,可以用下图来表示(白色的记录代表普通的数据承载记录,红色的data 属性等于null代表删除操作):

现在,对于 table 中的每条记录,我希望能够计算出 nextRecord。这是时间上最接近当前记录的记录。当只有一个记录指向父级时,任务看起来很简单:

1 => 2
4 => 9
5 => 6
6 => 8
...

但是当多个子记录引用父记录时,计算这样的值变得更加困难:

2 => 3
3 => 5
7 => 11

还有一种情况是没有子引用,在这种情况下,结果应为 null(例如记录 #8 没有子记录,因此应返回 null)。

所以我不是要求自己编写查询(另一方面,这对我来说真的很棒),但至少指出了我可以找到解决这个问题的方向。

提前致谢!

您可以使用 parentIdtimestamp 上的复合索引高效地执行此操作。您可以这样创建索引:

r.table('data').indexCreate('parent_timestamp', function(row) {
  return [row('parentId'), row('timestamp')];
})

完成后,您可以像这样找到最早的具有父项 PARENT 的项:

r.table('data')
 .between([PARENT, r.minval], [PARENT, r.maxval], {index: 'parent_timestamp'})
 .orderBy({index: 'parent_timestamp'})
 .nth(0).default(null)