rethinkDB:​​按部分值分组

时间:2015-04-30 13:43:53

标签: rethinkdb

我正在评估我已导入rethinkDB的电话记录日志;文件看起来像这样:

{
    'date': '2015-01-02',
    'duration': 46,
    'cost': 0.25
    'type': 'outgoing'
}

我正在尝试检索一个月内所有通话时间的总和


我可以"手动"使用此查询实现它:

r.table('CallLog').filter(r.row('date').match('2015-01-*')).sum('duration')

考虑到我只需要它6个月,绝对有可能在合理的时间内完成。但是,我想在一个查询中找到一种方法 我知道我可以分组文件;例如通过我可以做的呼叫类型来总结所有呼叫的费用

r.table('CallLog').group('type').sum('cost')

我不知道的是,我如何按部分字段分组,在这种情况下是date字段的前7个字符。

有任何想法吗?谢谢你的帮助。

2 个答案:

答案 0 :(得分:2)

您可以通过将匿名函数传递给group方法,按部分字段进行分组。任何时候你想要一个group函数的特殊行为在匿名函数(lambda函数)中思考。

在这种情况下,您可以使用match方法传递一个正则表达式,该表达式将匹配4位数字和2位数字(\\d{4}-\\d{2})的字符串。

以下是查询的外观:

r.table('29969411')
  .group(function (row) {
    return row('date').match("\\d{4}-\\d{2}")
  }).sum('cost')

在表格中提供以下条目:

{
    "cost": 0.25 ,
    "date":  "2015-02-02" ,
    "duration": 46 ,
    "id":  "1ff56fdd-9152-4729-baa4-c9736adbe54f" ,
    "type":  "outgoing"
}, {
    "cost": 0.25 ,
    "date":  "2015-03-02" ,
    "duration": 46 ,
    "id":  "74a453ec-531c-4fb0-a463-661b122d47df" ,
    "type":  "outgoing"
}, {
    "cost": 0.25 ,
    "date":  "2015-01-02" ,
    "duration": 46 ,
    "id":  "bfa9aa42-51c0-43ef-af3d-24de15ed6571" ,
    "type":  "outgoing"
}, {
    "cost": 0.25 ,
    "date":  "2015-01-99" ,
    "duration": 46 ,
    "id":  "c93ac248-f214-4649-a355-bfc814169456" ,
    "type":  "outgoing"
}

结果如下:

[
  {
    "group": {
    "end": 7 ,
    "groups": [ ],
    "start": 0 ,
    "str":  "2015-01"
  } ,
   "reduction": 0.5
  } ,
  {
    "group": {
    "end": 7 ,
    "groups": [ ],
    "start": 0 ,
    "str":  "2015-02"
  } ,
   "reduction": 0.25
  } ,
  {
    "group": {
    "end": 7 ,
    "groups": [ ],
    "start": 0 ,
    "str":  "2015-03"
  } ,
    "reduction": 0.25
  }
]

答案 1 :(得分:0)

谢谢你的回答,豪尔赫;与此同时,我也找到了(有一些帮助)另一个:

r.table('CallLog').group(r.row('date').match('.{7}')('str')).sum('cost')

得出以下结果:

[
    {
        "group":"2014-09",
        "reduction":214.8195
    },
    {
        "group":"2014-10",
        "reduction":20087.655200000074
    }
]