计算文档中数组中的不同变量

时间:2015-01-17 13:05:20

标签: rethinkdb

我尝试使用rethinkDB并使用一些查询来查看它是否适合用例。到现在为止还挺好。但是,我有一个关于reQL的问题。

例如,在这种情况下,我将分析事件存储在rethinkDB中,例如:

[{
  "userId": "abdf213",
  "timestamp": "Sat Jan 17 2015 00:32:20 GMT+00:00",
  "action": "Page"
},
{
  "userId": "123abc",
  "timestamp": "Sat Jan 17 2015 00:42:20 GMT+00:00",
  "action": "Track"
},
{
  "userId": "abdf213",
  "timestamp": "Sat Jan 17 2015 00:45:20 GMT+00:00",
  "action": "Track"
},
{
  "userId": "123abc",
  "timestamp": "Sat Jan 17 2015 00:44:20 GMT+00:00",
  "action": "Page"
},
{
  "userId": "123abc",
  "timestamp": "Sat Jan 17 2015 00:48:20 GMT+00:00",
  "action": "Page"
}]

我希望查询的最终结果如下:

{
  "group": "123abc",
  "reduction": {
    "Page": 2,
    "Track": 1
  }
},
{
  "group": "abdf213",
  "reduction": {
    "Page": 1,
    "Track": 1
  }
}

请记住,事先不知道动作名称。

TBH,我不太确定如何使用ReQL实现这一目标。

现在我有了这个查询(使用数据资源管理器):

r.db('test').table('events').group('userId').map(function(event) {
  return event('action')
})

返回像这样的文档:

{
  "group":  "-71omc5zdgdimpuveheqs6dvt5q6xlwenjg7m" ,
  "reduction": [
  "Identify" ,
  "Page" ,
  "Track"
  ]
}

任何人都可以指出我在正确的方向吗?

干杯,

取值

2 个答案:

答案 0 :(得分:3)

尝试:

r.table('events').group('userId').map(function(event) {
  return r.object(event('action'), 1);
}).reduce(function(a, b) {
  return a.merge(b.keys().map(function(key) {
    return [key, a(key).default(0).add(b(key))];}).coerceTo('object'));
})

答案 1 :(得分:1)

这是我的解决方案:

r.table("events").group("userId", "action").count().ungroup()
                 .group(r.row("group")(0))
                 .map([r.row("group")(1), r.row("reduction")])
                 .coerceTo("object")

ReQL不支持嵌套组,但您可以同时按多个字段进行分组,然后对输出执行进一步分组。