rethinkdb:辅助复合索引/聚合查询和中间文档生成

时间:2016-01-11 15:23:32

标签: indexing mapreduce aggregate rethinkdb rethinkdb-python

让我们假设这样的表内容,对于相同的product_id,我们在status == 1(已发布)期间拥有比更新更多的行,最后状态== 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]

这里的困难在于,只要product_id文档的last_updated日期小于或等于提供的日期,它仍然被视为最新状态。

我尝试按product_id进行分组,然后取最大值(&#39; last_updated&#39;),然后只保留每个缩减唯一文档,如果状态== 1

我想到每个状态/ given_date

都有一个索引

或者另一种解决方案是,在另一个表中插入聚合的结果,该聚合仅在每个日期存储唯一文档,包含匹配相同条件的所有初始文档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:

这是我尝试运行以分析我的数据的查询的示例,例如,这里是为了概述每个包含多个文档的组的状态:

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

0 个答案:

没有答案