【问题标题】:Angular FireStore Collections inside Documents文档中的 Angular FireStore 集合
【发布时间】:2018-05-11 19:41:03
【问题描述】:

我正在尝试使用 Firebase FireStore 数据库在 Angular 2 中构建一个聊天应用程序。
我能够为每个“消息”创建一个Collection,并带有一个Docuement。 我使用此代码检索消息:

export interface MessageItem {
  message: string;
  DateTime: Date;
  User: string;
}

messagesCollection: AngularFirestoreCollection<MessageItem>;
messages: Observable<MessageItem[]>;

getChatData() {
  this.messagesCollection = this.afs.collection<MessageItem>('chat_messages');
  this.messages = this.messagesCollection.valueChanges();
}

但是,因为我想要多个用户,所以我想为每个用户创建一个 Document,它存储在消息的 Collection 中。
这使事情变得复杂,我不知道该怎么做。
我很乐意提供一些指导。

【问题讨论】:

    标签: angular firebase observable google-cloud-firestore


    【解决方案1】:

    您可以采取的一种方法是将文档集合存储为“消息”,而不是将文档集合存储为“消息”,您希望创建一个“对话”集合,然后在每个“对话”文档中都有一个简单的“文档参考”数组引用该对话中的两个用户。您也可以只存储每个用户的 UID,然后在必要时获取用户。然后,在“对话”文档中,您将拥有两个用户之间的消息集合。这是我会采用的一种方法,如果您需要更多帮助,我可以创建模型服务和数据结构以作为示例显示。简而言之,首先存储对话将有助于此处的结构。

    这是我如何设置 Firestore 结构的示例:

    在对话集合中,我将向用户存储一个 DocumentReferences 数组,然后有一个与此对话相关的消息集合。

    现在,在 users 集合中,我将为每个用户创建一个文档,其中 Document Id 是来自经过身份验证的用户的 UID。这似乎是多余的,但我也会在用户集合中创建一个对话集合,其中每个文档只有一个字段,它是对话文档的 DocumentReference。以下是 convos 集合中该文档的示例:

    通过这种方式,您可以阻止用户在 Conversations 集合内创建重复的对话文档,并且您只需要确保在对话开始后将对话引用保存到每个用户的 convos 集合即可。

    从服务中获取数据时,您需要进行快照更改并获取该引用路径,然后在快照上的地图函数内部请求对话。如果您在创建此服务并使用 angularfire2 设置服务后需要该服务的指导,请告诉我。

    【讨论】:

    • 谢谢。如果我理解正确的话,每个收藏都是一次对话。但是如何将消息存储为对话中的子集合?
    • 是的,在每个“对话”文档中,您都会有一个消息集合,每个消息都可能包含消息、有关消息的信息,然后是发送该特定消息的用户的 DocumentReference。如果您要使用 Firebase RTDB,上面的 Richard Matsens 回答解释了 JSON 结构。对于 Firestore,这只是文档中的嵌套集合。
    • 还要在上面的评论中澄清,每个“收藏”都不是对话。您将拥有包含“消息”集合的对话文档的“集合”
    【解决方案2】:

    有很多方法可以走,但是这个Build A Real-Time Chat App With VueJS, Vuex & Cloud Firestore 在 vue 中展示了一个相当不错的实现。

    这是他们的谈话文件。

    对话结构

    {
      created: Date.now(),
      users: ['mr_a', 'mr_b'],
      messages: [
        { id: uuidv4(), text: 'Hi there', sender: 'mr_a', created: Date.now() },
        { id: uuidv4(), text: 'Hi to you too!', sender: 'mr_b', created: Date.now() }
      ]
    }
    

    有关 AngularFire2 的机制,请参阅 Simple Chat App with AngularFire2 (Firebase + Angular 2)。它使用一个带有消息的对话作为文档。

    【讨论】:

    • 谢谢。这很有帮助,尽管我仍然不确定如何在 Angular 中准确地构建它,以及 Observables 等等。例如,如何将消息添加到消息数组?
    • 从 Vue 示例项目中,'Firestore 文档使用 update() 更新,它允许您更新某些字段,而无需触及其他字段。'。见Add Data to Cloud Firestore
    猜你喜欢
    • 1970-01-01
    • 2018-05-05
    • 2018-10-21
    • 1970-01-01
    • 1970-01-01
    • 2021-02-20
    • 2018-11-26
    • 2018-04-25
    • 2022-01-05
    相关资源
    最近更新 更多