漏斗和RethinkDB

时间:2015-02-06 17:22:22

标签: rethinkdb

我在RethinkDB中保存了一些步骤:

{
 date: "Sat Feb 06 2015 00:00:00 GMT+00:00",
 step: 1
},
{
 date: "Sat Feb 06 2015 11:11:11 GMT+00:00",
 step: 3
},
{
 date: "Sat Feb 06 2015 22:22:22 GMT+00:00",
 step: 2
}

我想计算按顺序1,2,3完成的步数。

因此,对于这个例子,我想得到这样的东西:

{
 step_1: 1,
 step_2: 1,
 step_3: 0
}

我看过第1步,所以step_1是1 我看过第2步,之前已经看过第1步,所以step_2是1 我已经看到了第3步,但我之前没有看过第2步,所以step_3为0

我尝试了很多东西,但没有办法做到这一点,实际上我并不确定RethinkDB可以做到这一点。
你们中有谁对我有想法?

谢谢,
阿德里安

1 个答案:

答案 0 :(得分:1)

作为前言:这确实滥用r.js术语,因此总是会有点慢。所以这个解决方案并不适合生产服务。除非有人提出更好的答案(即:所有ReQL),否则最好在客户端进行此操作,可能使用groupmin来预先消化其中的一部分。

我们中的一些人真的认为有一个答案,我的主要使用reduce和JavaScript函数。不幸的是,在这个答案的工作中,我发现了一个崩溃我们服务器的错误,所以目前我的答案有点未经测试,不推荐,但进行中的版本可能会给你一个答案的开始:

r.table('alpha').reduce(r.js('''(
function(left, right) {
    var returnValue = [];
    var sources = [left, right];
    for (var i in sources) {
        var source = sources[i];
        if (source.date) {
            if (!returnValue[source.step] || returnValue[source.step] > source.date) {
                returnValue[source.step] = source.date;
            }
        } else {
            for (i in source) {
                if (!returnValue[i] || returnValue[i] > source(key)) {
                    returnValue[i] = source(key);
                }
            }
        }
    }
    return returnValue;
})''')).map(r.js('''(
function (row) {
    var allValid = true;
    var lastDate = 0;
    var returnValue = [];
    for (i in row) {
        var afterLast = row[i] && row[i] > lastDate && allValid;
        allValid = afterLast == true;
        returnValue.push(afterLast);
        lastDate = row[i];
    }
}
})''')).run()