文档

时间:2017-11-28 11:07:34

标签: angular firebase observable google-cloud-firestore

我正在尝试使用Firebase FireStore数据库在Angular 2中构建聊天应用 我能够为每条“消息”创建一个CollectionDocuement。 我使用此代码来检索消息:

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条消息中。
这使它变得复杂,我不确定如何准确地做到这一点 我很乐意提供一些指导。

2 个答案:

答案 0 :(得分:2)

您可以采取的路线不是将文件集存储为“消息”。你想要创建一个&#39;对话&#39;并且在每次谈话中#39;然后,文档有一个简单的数组&#39; DocumentReferences&#39;引用该对话中的两个用户。您也可以只存储每个用户的UID,然后在必要时获取用户。然后,在&#39;对话&#39;内部文档,您将在两个用户之间收集消息。这是我将采取的一种方法,如果您需要更多帮助,我可以创建模型服务和数据结构作为示例。简而言之,首先存储会话将有助于此处的结构。

以下是我将如何设置Firestore结构的示例:

enter image description here

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

enter image description here

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

enter image description here

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

从服务中获取数据时,您需要使用snapshotChanges并获取该引用路径,然后在快照上的map函数内请求对话。如果您在创建此服务并使用angularfire2设置服务后需要有关服务的指导,请通知我。

答案 1 :(得分:1)

还有很多方法可以实现,但这个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)。它使用一个与消息的对话作为文档。