我在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可以做到这一点。
你们中有谁对我有想法?
谢谢,
阿德里安
答案 0 :(得分:1)
作为前言:这确实滥用r.js
术语,因此总是会有点慢。所以这个解决方案并不适合生产服务。除非有人提出更好的答案(即:所有ReQL),否则最好在客户端进行此操作,可能使用group
和min
来预先消化其中的一部分。
我们中的一些人真的认为有一个答案,我的主要使用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()