1

让我们假设这样的表格内容,对于相同的 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
    )
  })
4

0 回答 0