2

「カテゴリ」テーブルがあり、各カテゴリには「データ」テーブルに関連付けられたデータがあり、「関連付けられた」他のテーブルに関連付けられたデータがあり、関連付けられているすべてのデータを含むカテゴリを削除したいとします。私が現在行っていることは、次のようなものです。

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

これらのクエリをデータベース側でチェーンする方法はありますか? 私の関数は現在次のようになっています:

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()
    }

前のクエリの結果に基づいてクエリを実行したいので、r.expr() または r.do() を使用できないことに注意してください。私のアプローチの問題は、すべての ID をクライアント側に持ってくる必要があるため、大量の「データ」に対しては機能しないことです。ループ内のクライアント側でページングを行うことは回避策のようです。

4

1 に答える 1

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())
});
于 2015-08-08T22:56:48.417 に答える