2015-01-17 57 views
0

我正在嘗試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') 
}) 

這回DOC像這樣的:

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

任何人都可以點我在這裏向正確的方向?

乾杯,

小號

回答

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

這裏是我的解決方案:

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

ReQL不支持嵌套組,但您可以同時按多個字段分組,然後在輸出上執行進一步分組。

+0

這是一個有效的答案(和清潔),但是你的查詢比@ user3595332慢6倍。我不知道爲什麼。您的查詢平均時間是我的筆記本電腦的1.2秒,而另一個是200毫秒... – Syl

相關問題