gpt4 book ai didi

Firebase 计数分组依据

转载 作者:行者123 更新时间:2023-12-03 00:09:45 24 4
gpt4 key购买 nike

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"
}
}

基于data键所需的结果:

0 => 2  
25 => 2
50 => 1
75 => 1
100 => 1

当然,我必须考虑到它将有数千个 child ,而不仅仅是 7 个......

谢谢!

编辑
对应用程序和我们想要解决的问题进行更深入的解释。

我们有在不同网站上运行的视频脚本,每个视频 session (用户 session )都会发送事件和数据,您可以在此处查看示例,检查“网络”选项卡 - https://secure.bwebi.co/videostir/regular.html

我们的目标是收集这些数据并创建一个包含少量图表和图形的实时分析仪表板。

可以看到我们当前的数据结构here

我们需要的图表示例:
完成率
常规 - 条形图显示每个剪辑持续时间预定义时间段的观看总数。
过滤器 - 日期(开始/结束)、唯一/全部、所有 url/特定 url(嵌入)、所有配置/特定配置/忽略静默。
X 轴 - 组 0-25、25-50、50-75、75-99、100
Y 轴 - 观看次数

每日观看次数(含完成率)
一般 - 多线图显示每个持续时间段每天的观看次数。
过滤器 - 日期(开始/结束)、唯一/全部、所有 url/特定 url(嵌入)、所有配置/特定配置/忽略静默。
X 轴 - 以天为单位的时间
Y 轴 - 观看次数
线路:
每日总观看次数
每日观看次数,持续时间为 100%
每日观看次数,持续时间为 75-99%
每日观看次数,持续时间为 50-75%
每日观看次数,持续时间为 25-50%
每日观看次数,持续时间为 0-25%

希望现在更清楚了!

最佳答案

Group by 是一个 SQL 函数。 SQL 无法处理实时数据的原因是这种方法无法扩展。 Mongo 提供了类似的功能,但同样,it doesn't scale 。您可能会注意到 Firebase 不提供此类查询功能的一个模式。

如果您提供一些您实际上想要在此处完成的任务的上下文、应用程序的规则是什么以及您排除了哪些方法,而不仅仅是您预设的分组解决方案,这将非常有帮助。可能还有其他的、可能更好的替代方案。请参阅XY problem .

以下是通过对您的用例进行全面假设而得出的几个通用替代方案。

存储总计

这是最具可扩展性的解决方案。按如下方式存储您的数据:

/playbacks/$id/<playback data>
/group_totals/$group/<count>

写入回放时,还要更新相应组的计数:

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;
});
}

现在,当您想要获取某个组的总计时,您只需在 group_totals/$group 中查找该值即可。同样,您可以存储属于每个组的记录的 ID 并利用 index仅获取给定组的记录。

使用优先级来获取和分组

更简单的方法是根据组/数据值为每个记录赋予优先级。

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;
});
}

现在获取给定组的一组记录:

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);
});
}

关于Firebase 计数分组依据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26331071/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com