目的の結果を達成するための 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))