Rethinkdb多对多关系

时间:2018-03-22 10:10:02

标签: rethinkdb rethinkdb-javascript

我有以下表格

实体

i

entity_authors

|id|title|

entity_to_authors

|id|authorName|

我设法加入了表|id|entityId|authorId| entity

entity_to_authors

现在我需要从表r.table("entity") .get("f17234b6-b25c-4037-8dd1-314841967964") .merge({e -> r.hashMap("entity_to_authors", r.table("entity_to_authors").filter(r.hashMap("entityId", e.g("id"))).coerceTo("array"))}) .run<Unit>(connection) 获取数据 我是这样做的(但这是错的)

entity_authors

因为我在这里使用r.table("entity") .get("f17234b6-b25c-4037-8dd1-314841967964") .merge({e -> r.hashMap("entity_to_authors", r.table("entity_to_authors").filter(r.hashMap("entityId", e.g("id"))).coerceTo("array"))}) .merge({e -> r.hashMap("entity_authors", r.table("entity_authors").filter(r.hashMap("id", e.g("entity_to_authors").nth(0).g("authorId"))).coerceTo("array"))}) .run<Unit>(connection) 来获取从nth(0)收到的第一行数据 我该怎么办才能得到所有作者?

抱歉我的英文!

2 个答案:

答案 0 :(得分:0)

有人告诉我这样做了:

.merge{ row -> r.hashMap("entity_authors", r.table("entity_authors") .filter { ea -> row.g("entity_to_authors").g("authorId").contains(ea.g("id")) } .coerceTo("array"))}

答案 1 :(得分:0)

这是写查询的一种方法:-

r.table("entity")
  .merge(function(entity) {
    return {
     authorIds: r.table("entity_to_authors").filter({ entityId: entity("id")})("authorId").coerceTo("array")
    }
  })
  .merge(function(entity) {
    return {
     authors: r.table("entity_authors").getAll(r.args(entity("authorIds"))).coerceTo("array")
    }
  })
  .without("authorIds")

步骤1:从第一次合并中获取映射的authorIds数组。

第2步:从第二次合并中的authorIds中获取作者。 getAll通常采用逗号分隔的值,要传递数组,您需要使用r.args

第3步:最后,从结果中删除authorIds属性,我们不想在结果中映射,我们想映射作者。

希望有帮助。