我在rethinkdb中有一个如下表(实现树结构)的表:
id label parent
1 Node 1
2 Node 2 1
3 Node 3 1
4 Node 4 2
我想写一个查询,它给出了以下输出:
id label parent
1 Node 1
2 Node 2 Node 1
3 Node 3 Node 1
4 Node 4 Node 2
为此,我写了以下内容:
r.db("exampleDB").table("exampleTable").eqJoin("parent", r.db("exampleDB").table("exampleTable")).merge(function(val) {
return {
"left": {
"parent": val("right")("label")
}
}
}).without({
"right": true
}).zip()
此查询返回除根节点之外的所有行。我如何得到它,我也想知道这是否是最有效的方法,因为我可能也必须在很复杂的情况下这样做。
答案 0 :(得分:0)
您可以使用内部联接进行一些修改:
r.db("exampleDB").table("exampleTable").innerJoin(r.db("exampleDB").table("exampleTable"), function(left, right){
// if parent is not empty join by parent <--> id
return left("parent").eq(right("id"))
// or if parent is empty
.or( left("parent").eq("").and(left("id").eq(right("id"))))
}).merge(function(val) {
return {
"left": {
"parent": r.branch(
// if row parent field is empty
val("left")("parent").eq(""),
// just return empty string
"",
// otherwise get label field of parent
val("right")("label")
)
}
}
}).without({
"right": true
}).zip().orderBy("id")