Firebase是否支持分组计数?
我想计算按值分组的特定键.
我的数据结构示例:
"playbackPosition" : {
"-JZ2c7v-imQXaEx2c4Cs" : {
"data" : "0"
},
"-JZ2cDta73UGAgwIOejL" : {
"data" : "25"
},
"-JZ2cJutDZu-7quLpLI2" : {
"data" : "50"
},
"-JZ2cO-Me0nGK5XLTwd-" : {
"data" : "75"
},
"-JZ2cSh-XnstYxbE_Zad" : {
"data" : "100"
},
"-JZ2cWxya0-kmTPCze4u" : {
"data" : "0"
},
"-JZ2c_wX-ODv43TKXkNG" : {
"data" : "25"
}
}
Run Code Online (Sandbox Code Playgroud)
基于data密钥的必需结果:
0 => 2
25 => 2
50 => 1
75 => 1
100 => 1
Run Code Online (Sandbox Code Playgroud)
当然,我必须考虑它将有成千上万的孩子,而不仅仅是7 ...
谢谢!
编辑
更深入的应用程序解释和我们想要解决的问题.
我们有在不同网站上运行的视频脚本,每个视频会话(用户会话)发送事件和数据,您可以在此处查看示例,查看网络选项卡 - https://secure.bwebi.co/videostir/regular.html
我们的目标是收集这些数据并创建一个包含少量图表和图形的分析实时仪表板.
您可以在此处查看我们当前的数据结构
我们需要的图表示例:
完成率
一般 - 条形图显示每个剪辑持续时间预定义时段的总视图数.
过滤器 - 日期(开始/结束),唯一/全部,所有网址/特定网址(嵌入),所有配置/特定配置/忽略静默.
X轴 - 组0-25,25-50,50-75,75-99,100
Y轴 - 视图数
每日观看次数(包括完成率)
常规 - 多行图表显示每个持续时间段每天的观看次数.
过滤器 - 日期(开始/结束),唯一/全部,所有网址/特定网址(嵌入),所有配置/特定配置/忽略静默.
X轴 - 以天为单位的时间
Y轴 - 视图数量
行数:
每日总观看
次数持续时间为100%的
每日视图持续时间为75-99%的
每日视图持续时间为50-75%的
每日视图持续时间为25-50%的
每日视图每日视图持续时间为0-25%
希望现在更清楚了!
Kat*_*ato 11
Group by是一个SQL函数.SQL无法执行实时数据的原因是因为这种方法无法扩展.Mongo提供了类似的功能,但它再一次没有扩展.您可能会注意到Firebase不提供此类查询功能的原因.
如果您提供了一些关于您在这里实际尝试完成的内容,应用程序的规则以及您已经排除的方法,而不仅仅是您预先假定的分组解决方案,那将非常有用.可能还有其他可能更好的选择.请参阅XY问题.
以下是通过对您的用例做出全面假设而得出的几个通用替代方案.
这是最具扩展性的解决方案.存储您的数据如下:
/playbacks/$id/<playback data>
/group_totals/$group/<count>
Run Code Online (Sandbox Code Playgroud)
写入播放时,还要更新相应组的计数:
var fb = new Firebase(URL);
function addPlayback(rec) {
var ref = fb.child('playbacks').push(rec, function(err) {
if( err ) throw err;
incrementCount(rec.data);
});
}
function incrementCount(count) {
fb.child('group_totals/' + count).transaction(function(currentVal) {
return (currentVal||0)+1;
});
}
Run Code Online (Sandbox Code Playgroud)
现在,当您想获得组的总数时,您只需在group_totals/$ group中查找值即可.同样,您可以存储属于每个组的记录的ID,并利用该索引仅获取给定组的记录.
更简单的方法是根据组/数据值为每条记录赋予优先级.
var fb = new Firebase(URL);
function addPlayback(rec) {
rec['.priority'] = rec.data;
var ref = fb.child('playbacks').push(rec, function(err) {
if( err ) throw err;
});
}
Run Code Online (Sandbox Code Playgroud)
现在为一个给定的组获取一组记录:
var fb = new Firebase(URL);
function getGroup(groupValue, callback) {
fb.child('playbackPosition').startAt(groupValue).endAt(groupValue).once('value', callback);
}
function logGroupCount(groupValue, callback) {
getGroup(groupValue, function(snap) {
console.log('there are ' + snap.numChildren() + ' items in group ' +groupValue);
});
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6188 次 |
| 最近记录: |