加入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
)。
所以我不是要求自己编写查询(另一方面,这对我来说真的很棒),但至少指出了我可以找到解决这个问题的方向。
提前致谢!
您可以使用 parentId
和 timestamp
上的复合索引高效地执行此操作。您可以这样创建索引:
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)
我在 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
)。
所以我不是要求自己编写查询(另一方面,这对我来说真的很棒),但至少指出了我可以找到解决这个问题的方向。
提前致谢!
您可以使用 parentId
和 timestamp
上的复合索引高效地执行此操作。您可以这样创建索引:
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)