2015-08-08 64 views
2

假设我有一个“类别”表,每个类别都有“数据”表中的关联数据,并且它与其他关联的数据表中的“关联”有关联,我想删除一个与它关联的所有类别数据。 目前我在做什么是这样的:在rethinkdb中链接查询

getAllDataIdsFromCategory() 
     .then(removeAllAssociated) 
     .then(handleChanges) 
     .then(removeDatas) 
     .then(handleChanges) 
     .then(removeCategory) 
     .then(handleChanges); 

有没有办法来链接这些查询的DB-侧? 我目前的功能是这样的:我不能用r.expr()或r.do(),因为我想根据以前的查询结果做查询

var getAllDataIdsFromCategory =() => { 
     return r 
      .table('data') 
      .getAll(categoryId, { index: 'categoryId' }) 
      .pluck('id').map(r.row('id')).run(); 
    } 

var removeAllAssociated = (_dataIds: string[]) => { 
     dataIds = _dataIds; 
     return r 
      .table('associated') 
      .getAll(dataIds, { index: 'dataId' }) 
      .delete() 
      .run() 
    } 

var removeDatas =() => { 
     return r 
      .table('data') 
      .getAll(dataIds) 
      .delete() 
      .run() 
    } 

通知。 我的方法存在的问题是,它不适用于大量的“数据”,因为我必须将所有的ID都带到客户端,并且在循环中在客户端进行分页似乎是一种解决方法。

回答

5

您可以使用forEach此:

r.table('data').getAll(categoryID, {index: 'categoryId'})('id').forEach(function(id) { 
    return r.table('associated').getAll(id, {index: 'dataId'}).delete().merge(
    r.table('data').get(id).delete()) 
});