我尝试使用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"
]
}
任何人都可以指出我在正确的方向吗?
干杯,
取值
答案 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不支持嵌套组,但您可以同时按多个字段进行分组,然后对输出执行进一步分组。