我正在使用Firebase(和AngularJS)构建聊天应用,我的数据结构类似于this Firebase documentation page上的数据结构。这种结构非常适合不必检索大量不需要的数据,但我似乎并不理解这一点。
当我的数据如下所示,当用户连接到我的应用时:
// An index to track Ada's memberships
{
"users": {
"alovelace": {
"name": "Ada Lovelace",
// Index Ada's groups in her profile
"groups": {
// the value here doesn't matter, just that the key exists
"techpioneers": true,
"womentechmakers": true
}
},
...
},
"groups": {
"techpioneers": {
"name": "Historical Tech Pioneers",
"members": {
"alovelace": true,
"ghopper": true,
"eclarke": true
},
"lastUpdateTime": [SOME TIMESTAMP HERE]
},
...
}
}
正如您所看到的,我已将"lastUpdateTime": [SOME TIMESTAMP HERE]
添加到上面的代码中,因为它是我为我的应用做的。我无法弄清楚应该是什么样的刷新过程"用户组列表。
如果我的用户有100个群组,我应该检索群组ID的列表并逐个获取实际群组,以便能够保留最近的10个群组(我很确定这不是这种方式去)?
此外,每当有人在群组中发布消息时,它都会更新Firebase中的lastUpdateTime
,但如何将用户组列表与此同步?
我已经尝试过一些非常丑陋的子事件组合,orderBys以及整个函数链,无论什么时候发生什么事情都会执行,但它不起作用,而且看起来非常复杂,什么都不是。扁平化数据的整个想法是将查询/提取保持在最低限度,我觉得到目前为止我做的事情太沉重了。
答案 0 :(得分:1)
显示最近更新的10个组的列表:
ref.child("groups").orderByChild("lastUpdateTime").limitToLast(10)
如果您使用此方法,请进一步展平您的数据,因为查询现在将最终检索每个组的成员,这不是显示组列表所必需的。
如果您想要按照上次更新的顺序订阅用户订阅的组列表,您可以选择以下几种方法:
为订阅该论坛的每个用户存储上次更新该组的时间戳:
" usersgroups":{ " alovelace":{ //该值是上次更新组的时间戳 " techpioneers":14952982198532978, " womentechmakers":14852982198532979 },
您注意到我在此处从用户个人资料中拆分了群组成员资格,因为您不应该嵌套这些松散相关的数据。
然后,您可以使用正确的顺序获取用户组的列表:
ref.child("usersgroups/alovelace").orderByValue()
这种方法的主要问题是,您需要为所有成员更新组的时间戳。因此写入会变得更加昂贵。
听起来这可能会慢一些,但实际上它确实太糟糕了。由于您只加载用户所属的群组,因此该数字不会太高。 Firebase管理请求,因此性能比您预期的要好很多。见Speed up fetching posts for my social network app by using query instead of observing a single event repeatedly