当我的数据被非规范化(Firebase)时,如何在上次更新时间之前对我的聊天组进行排序



我正在用Firebase(和AngularJS)构建一个聊天应用程序,我的数据结构与Firebase文档页面上的数据结构相似。这种结构很好,不必检索大量不需要的数据,但我似乎不理解一件很简单的事情。

当用户连接到我的应用程序时,我的数据如下所示:

如何检索他们最近更新的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)

如果您使用这种方法,请进一步压平您的数据,因为查询现在将检索每个组的成员,而显示组列表不需要这些成员。

如果你想按上次更新的顺序列出用户订阅的组,你有几个选项:

  • 存储每个用户订阅的最后更新时间戳
  • 加载用户组并在客户端重新排序

存储每个用户订阅的最后更新时间戳

为每个订阅组的用户存储组上次更新的时间戳:

"用户组":{"alovelace":{//该值是组上次更新的时间戳"技术先驱":14952982198532978,"女性科技制造商":148529821985352979},

您会注意到,我在这里从用户配置文件中分离了组成员身份,因为您不应该嵌套这种松散相关的数据

然后,您可以使用以正确的顺序获得用户组的列表

ref.child("usersgroups/alovelace").orderByValue()

这种方法的主要问题是,您需要为所有成员更新组的时间戳,以便发布。因此,写作变得更加昂贵。

加载用户组并在客户端重新排序

这听起来可能会更慢,但实际上不会太糟。由于您只加载用户所属的组,因此数量不会太高。Firebase通过管道传输请求,因此性能比您预期的要好得多。请参阅通过使用查询而不是重复观察单个事件来加快我的社交网络应用程序获取帖子的速度

最新更新