0

次のような行を含むテーブルがあります。

{
  "id": "12345"
  "created_date": Fri May 27 2016 22:06:25 GMT+00:00 ,
} {
  "id": "6789"
  "created_date": Mon May 30 2016 07:48:35 GMT+00:00 ,
}

etc...
  1. 今日から 2 週間以内に作成された行のみを取得して、最初に行をフィルタリングしようとしています。

  2. 次に、一意のIDのみ(重複なし)を取得してフィルタリングしようとしていますが、それでも最新のIDを取得しています。

より効率的な場合は、このフィルタリングを逆に行うことができます。

この擬似コードの行に沿った何か:

r.db().table().filter( r.time(r.row['created_date']) > r.now()-2_weeks).filter(latest-uniques-only)
4

1 に答える 1

2

目的の結果を達成するための 2 つのオプションを次に示します。

フィルターとグループの使用

次のクエリを使用して、このルックアップを実行できます (コードは Javascript API を使用しており、データ エクスプローラーを介してテーブルでテストされています)。

r.table('the_table')
.group('the_id') // group by the id
  .filter((row) => {
    return row('created_date').gt(r.now().sub(86400*14)); // only include records from the last 14 days
  })
  .orderBy(r.desc('created_date')) // order by latest first
  .pluck('the_id', 'created_date') // just include id and date in results

.ungroup() // stop performing actions on the group
.map((row) => row('reduction').nth(0)); // map the results only retrieving the first row of each group, the latest for each id

フィールドthe_idが一意でない場合、このクエリはthe_id、過去 2 週間に作成されたそれぞれの最新のレコードを返します。

セカンダリ インデックスを使用する

上記のクエリをより効率的/パフォーマンス的にするには、インデックスを配置しcreated_date、コマンドを使用してbetween()、過去 2 週間以内に作成されたすべての日付を検索します。

まず、日付フィールドにインデックスを作成します。

r.table('the_table').indexCreate('created_date');

次に、これを使用して、テーブルをより効率的にフィルター処理できます。

r.table('the_table')
 .between(r.now().sub(86400*84), r.now(), { index: 'created_date'})
 .group('the_id')
  .orderBy(r.desc('created_date'))
  .pluck('the_id', 'created_date')
 .ungroup()
 .map((row) => row('reduction').nth(0))
于 2016-06-02T18:11:01.430 に答える