执行嵌套过滤器/连接

时间:2015-07-07 04:17:44

标签: rethinkdb

我有3张桌子。 forums,其中有许多posts,其中有许多comments。我想从一个特定的comments中检索所有forum。我知道我可以作为单独的查询执行以下操作:

var chosenForumID = "...";
var posts = /* get all posts where post.forumID === chosenForumID */;
var comments = /* get all comments where comment.postID is in 'posts' */; 

虽然可以使用一个嵌套查询吗?

1 个答案:

答案 0 :(得分:2)

天真的方式

您可以通过执行以下操作在一个查询中实际执行此操作:

r.table('forums')
 .get(ID)
 .merge({
   'comments': r.table('posts').filter({ 'forumID': ID })('id').coerceTo('array')
      .do(function (postsIdsArray) {
        return r.table('comments').filter(function (row) {
           return postsIdsArray.contains(row('id'));
        })
      }).coerceTo('array')
 })('comments')

更好的方式

如果您正在执行此操作并且您在子级上有关系(子级具有指向ID的父级属性),那么您应该为forumID和{{1}创建辅助索引}。

postID

创建它们之后(您只需要创建一次),然后可以使用// Create Indexes r.table('posts').indexCreate('forumId') r.table('comments').indexCreate('postId') 术语使其成为索引操作。

getAll

辅助索引可以加快此操作。