angularjs - 当我的数据非规范化时(Firebase),如何按上次更新时间对我的聊天组进行排序?

标签 angularjs firebase firebase-realtime-database nosql

我正在使用 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/

相关文章:

angularjs - Angularjs 过滤器中的变量名

javascript - 触发 AngularJS ng-model pipeline onBlur

angularjs - 带有 $http 包装器 angularjs 的提供者

android - 与 Firebase 混淆变量范围

安卓——火力地堡;登录时,检索数据(分层)并根据该数据重定向该用户

firebase - 使用 Firebase 实时数据库在 Flutter 中进行分页

java - 以同步方式从 firebase 获取数据

javascript - 找不到指令 'ngSwitch' 所需的 AngularJS Controller 'ngSwitchWhen'

android - 我有基于 firebase 实时数据库的实时应用程序,有人更改了数据,他怎么能这样做?

iOS/谷歌广告给出链接器代码失败