我正在使用 Firebase(和 AngularJS)构建一个聊天应用,并且我有一个与 this Firebase documentation page 上的数据结构类似的数据结构。 。这种结构有利于不必检索大量不需要的数据,但我似乎不明白一件非常简单的事情。
当用户连接到我的应用程序时,我的数据如下所示:
如何检索他们最近更新的 10 个群组,并在群组中发布新消息时保持此列表的更新?
// 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 以及每当有东西触发时执行的整个函数链的组合,但它不起作用,而且看起来非常复杂,毫无意义。扁平化数据的整个想法是将查询/获取保持在最低限度,我觉得到目前为止我所做的事情太繁重了。
最佳答案
要显示最近更新的 10 个组的列表:
ref.child("groups").orderByChild("lastUpdateTime").limitToLast(10)
如果您使用此方法,请进一步展平您的数据,因为查询现在最终将检索每个组的成员,而显示组列表不需要这样做。
如果您想要按上次更新的顺序获得用户订阅的群组列表,您有以下几种选择:
- 存储每个用户订阅的最后更新时间戳
- 加载用户组并在客户端重新排序
存储每个用户订阅的最后更新时间戳
为订阅该群组的每个用户存储该群组上次更新的时间戳:
“用户组”:{ “爱乐蕾丝”:{ //该值是该组上次更新的时间戳 “科技先锋”:14952982198532978, “女性科技创客”: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
关于angularjs - 当我的数据非规范化时(Firebase),如何按上次更新时间对我的聊天组进行排序?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41704506/