让我们假设这样的表格内容,对于相同的 product_id,我们在 status==1(已发布)和最后 status==0(未发布)期间的更新行数与更新数一样多,然后变为==2(已删除)
{id: <auto>, product_id: 1, last_updated: 2015-12-1, status: 1, price: 1}
{id: <auto>, product_id: 2, last_updated: 2015-12-1, status: 1, price: 10}
{id: <auto>, product_id: 1, last_updated: 2015-12-2, status: 1, price: 2}
{id: <auto>, product_id: 1, last_updated: 2015-12-3, status: 0, price: 2}
{id: <auto>, product_id: 2, last_updated: 2015-12-2, status: 0, price: 10}
{id: <auto>, product_id: 3, last_updated: 2015-12-2, status: 1, price: 123}
{id: <auto>, product_id: 1, last_updated: 2015-12-4, status: 2, price: 2}
{id: <auto>, product_id: 2, last_updated: 2015-12-4, status: 2, price: 10}
现在,我正在尝试寻找一种方法,可能使用二级复合索引,例如,给定一个日期,例如 col1(使用 r.time)
DATE STATUS==1 STATUS==0 STATUS==2
2015-12-1 [101, 102] [] []
2015-12-2 [103, 106] [105] []
2015-12-3 [106] [104, 105] []
2015-12-4 [] [] [107, 108]
这里的困难在于,只要它的 last_updated 日期小于或等于提供的日期,product_id 文档仍将被视为最新状态。
我尝试按 product_id 分组,然后取 max('last_updated'),然后仅在 status==1 时保留每个缩减唯一文档
我想为每个状态/给定日期都有一个索引
或另一种解决方案,将在另一个表中插入聚合的结果,该聚合结果将仅存储每个日期的唯一文档,包含匹配相同条件的所有初始文档 ID,等等......然后稍后使用这些执行连接中间记录以在给定日期/状态获取每个 product_id 的值。
就像是:
{
date: <date_object>,
documents: [
{id: document_id, status: 1},
{id: document_id, status: 1},
{id: document_id, status: 2},
{id: document_id, status: 0},
...
]
}
请指教
编辑1:
这是我尝试运行以分析我的数据的查询示例,例如,这里是获取具有超过 1 个文档的每个组的状态的概述:
r.db('test').table('products_10k_sample')
.group({index: 'product_id'})
.orderBy(r.desc('last_updated'))
.ungroup()
.map(function(x){
return r.branch(
x('reduction').count().gt(1),
x('reduction').map(function(m){
return [m('last_updated').toISO8601(), m('status'), m('product_id')]
}),
null
)
})