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

Angularjs 当我的数据被非规范化(Firebase)时,如何按上次更新时间排序我的聊天组?,angularjs,firebase,firebase-realtime-database,nosql,Angularjs,Firebase,Firebase Realtime Database,Nosql,我正在用Firebase(和AngularJS)构建一个聊天应用程序,我有一个类似于上一个的数据结构。这种结构有利于不必检索大量不需要的数据,但我似乎不理解一件非常简单的事情 当用户连接到我的应用程序时,我的数据如下所示: 如何检索他们最近更新的10个群组,并在群组中发布新邮件时更新此列表? 如果您愿意阅读,请提供更多信息 如您所见,我在上面的代码中添加了“lastUpdateTime”:[此处的一些时间戳],因为这是我为我的应用程序所做的。我不知道用户组列表的“刷新过程”应该是什么 如果我的

我正在用Firebase(和AngularJS)构建一个聊天应用程序,我有一个类似于上一个的数据结构。这种结构有利于不必检索大量不需要的数据,但我似乎不理解一件非常简单的事情

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

如何检索他们最近更新的10个群组,并在群组中发布新邮件时更新此列表? 如果您愿意阅读,请提供更多信息
如您所见,我在上面的代码中添加了
“lastUpdateTime”:[此处的一些时间戳]
,因为这是我为我的应用程序所做的。我不知道用户组列表的“刷新过程”应该是什么

如果我的用户有100个组,我是否应该检索组ID列表并逐个获取实际的组,以便只保留最近的10个组(我很确定这不是最好的方法)

此外,每当有人在组中发布消息时,它都会更新Firebase中的
lastUpdateTime
,但如何使用户组列表与此保持同步


我尝试过一些非常难看的子事件、orderby的组合,以及在某个事件触发时执行的整个函数链,但它不起作用,而且看起来非常复杂,毫无意义。整平数据的整个想法是将查询/取数保持在最低限度,我觉得到目前为止我所做的工作太繁重了。

要显示最近更新的10个组的列表:

ref.child("groups").orderByChild("lastUpdateTime").limitToLast(10)
如果使用这种方法,请进一步展平数据,因为查询现在将检索每个组的成员,而显示组列表不需要这些成员

如果要按上次更新的顺序查看用户订阅的组列表,您有几个选项:

  • 存储每个用户订阅的上次更新时间戳
  • 加载用户组并在客户端对其重新排序
存储每个用户订阅的上次更新时间戳 存储为订阅组的每个用户上次更新组的时间戳:

“用户组”:{ “alovelace”:{ //该值是组上次更新的时间戳 “技术先锋”:1495298532978, “女性制造者”:14852982198532979 },

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

然后,您可以使用以下命令按正确顺序获取用户组的列表:

ref.child("usersgroups/alovelace").orderByValue()
这种方法的主要问题是,您需要为所有成员更新组的时间戳,以备发布。因此,写操作会变得非常昂贵

加载用户组并在客户端对其重新排序
这听起来可能会慢一些,但实际上不会太糟糕。因为您只加载用户所属的组,所以数量不会太高。Firebase会处理请求,因此性能比您预期的要好得多。请参阅

非常感谢,这正是我需要的答案。我很想这样做选择第一个选项,因为我的群组的用户数量有限。你能告诉我更多关于“写入变得更昂贵”的信息吗?这会让应用程序变得“迟缓”吗或者我们是在谈论客户端更新的延迟?如果每个组的用户数量有限,您会推荐第一种方法吗?我想了解为什么会这样,情况会有多糟。是因为Firebase需要处理大量的请求吗?我个人更可能只是加载用户组并在客户端重新排序-最好的建议是尝试这两种方法,看看什么对你最有效/感觉最自然。
ref.child("usersgroups/alovelace").orderByValue()