Angular2 Firebase,聊天应用程序
Posted
技术标签:
【中文标题】Angular2 Firebase,聊天应用程序【英文标题】:Angular2 Firebase, Chat Application 【发布时间】:2017-09-30 20:55:53 【问题描述】:我目前正在尝试在我的 Angular2 应用程序中实现私人聊天消息。目前我正在使用 AngularFire2 与火力基地一起工作。 我的消息的结构如下:
Messages
message_id_0
from: user_id_0
to: user_id_1
type: "private"
message: "a private message"
但目前我只能从一个 user_id 中选择消息。
this.af.database.list('messages',
query:
orderBy: "from",
equalTo: auth.uid,
...
所以我的问题是,如何为 user_1 和 user_2 选择所有带有“来自”字段名称的消息?由于 Firebase 不支持 WHERE 子句,这对我来说是一个挑战(
【问题讨论】:
【参考方案1】:创建另一个由“from”userId 和“to”userId 组成的字段,并在该字段上进行查询
如果我理解正确,您想显示一位用户,例如Jim,Jim 与特定其他用户之间的所有消息,例如沙龙。最简单的方法是在数据中创建一个新字段。
Messages
message_id_0
from: user_id_0
to: user_id_1
fromTo: user_id_0 * user_id_0 // <------- added field
type: "private"
message: "a private message"
// e.g. An example dataset might be:
Messages
message_id: 5903784520934857403
from: Jim
to: Sharon
fromTo: Jim*Sharon
type: "private"
message: "whatever"
然后你可以使用你的 angularfire sn-p,但是 orderBy fromTo 字段。
分隔符
值得在 userId 之间使用分隔符(这里我使用了星号),因为如果不这样做,可能会发生意外冲突,例如这两个不同的用户对将具有相同的 fromTo 值:
from: chris
to: topher
fromTo: christopher
from: christ
to: opher
fromTo: christopher
如果它们有分隔符,例如“*”,则 fromTo 会变得不同。确保使用 userId 中不能出现的字符。
其他索引字段
如果您还需要接收反方向的消息(即 Sharon 到 Jim),我可以想到两种解决方案:
-
对 Sharon*Jim 执行一个查询,对 Jim*Sharon 执行另一个查询
创建另一个字段fromToSorted,您可以在其中对两个 userId 进行排序,然后再将它们组合起来,这样两个通信方向都会产生相同的值 Jim*Sharon。
这显然可以扩展为您可能希望搜索或排序的每个组合都包含一个额外的字段。
在哪里执行此操作?
程序中创建这些额外字段的逻辑位置是创建消息的位置。在您的示例问题中,您选择索引的字段是其值在创建后无法更改的字段。
希望将这种方法用于值可以更改的字段的读者可能希望将创建这些额外字段的代码制作成一个函数,该函数可以在创建原始字段时调用或可能已编辑。
这不违反不多次存储相同数据的政策吗?
是的。规范化的这项政策来自数据存储更昂贵的时代,人们愿意等待计算机处理多个表以吐出答案。现在,对于您描述的任务类型,数据存储非常便宜,人们希望快速响应。因此,在 Firebase 和其他 NoSQL 数据库中,我们很乐意对数据进行非规范化处理,这有助于完成时间紧迫的任务。
最后一个警告:规范化的第二大好处是,如果每个数据项,例如“来自”字段的消息仅存储一次,我们的软件不可能意外只更新一个副本而不更新另一个副本。因此,当我们对数据库进行非规范化时,正如我在这个答案中所描述的那样,我们必须绝对严格地确保所有额外的字段(这里只是 fromTo 和 fromToSorted 字段) 会在 from 或 to 更新时更新。
【讨论】:
以上是关于Angular2 Firebase,聊天应用程序的主要内容,如果未能解决你的问题,请参考以下文章
在 Ionic2/Angular2 应用程序中使用 ngFor 获取 Firebase 数据库结果