将大数据集转换为简化对象

时间:2015-02-20 01:23:27

标签: rethinkdb

我有一个快速增长的重新思考数据库,我需要创建一些聚合查询来减轻客户端的负载。这是一个示例文档列表:

[
    {
        created_ts: 1424389239198,
        cost: 2,
        id: '12345678'
    },
    {
        created_ts: 1424389239198,
        cost: 2,
        id: '12345678'
    },
    {
        created_ts: 1424389239198,
        cost: 2,
        id: '12345678'
    }
]

我最终想要的是基于创建数据的小时的成本汇总(created_ts存储为纪元时间)。要从created_ts获取小时,我可以这样做:

r.epochTime(row('created_ts')).hours()

我需要一天中按小时分组的数据:

[
    {
        hour: 0,
        total_cost: 6
    },
    {
        hour: 1,
        total_cost: 10
    },
    {
        hour: 2,
        total_cost: 24
    }
]

那个数据在小时“0”(午夜)说我的总费用是6,凌晨1点,总费用是10,等等。我只是得到了它,所以它按小时分组,但我似乎无法把它变成像上面那样的“漂亮”对象。任何帮助深表感谢。 JavaScript中的示例非常受欢迎。谢谢!

2 个答案:

答案 0 :(得分:3)

您可以像以下那样将分组数据作为答案:

r.table('test').group(function(row) {
  return r.epochTime(row('created_ts')).hours();
}).sum('cost')

如果您想要指定的确切格式,可以这样做:

r.table('test').group(function(row) {
  return r.epochTime(row('created_ts')).hours();
}).sum('cost').ungroup().map(function(gr) {
  return {hour: gr('group'), cost: gr('reduction')}
})

答案 1 :(得分:1)

您可以在桌面上使用group sum费用,然后map使用结果来获得所需的结构:

r.table('foo')
 .group(r.epochTime(r.row('created_ts').div(1000)).hours())
 .sum('cost')
 .ungroup()
 .map({hour: r.row('group'), total_cost: r.row('reduction')})