我正在尝试使用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
条消息中。
这使它变得复杂,我不确定如何准确地做到这一点
我很乐意提供一些指导。
答案 0 :(得分:2)
您可以采取的路线不是将文件集存储为“消息”。你想要创建一个&#39;对话&#39;并且在每次谈话中#39;然后,文档有一个简单的数组&#39; DocumentReferences&#39;引用该对话中的两个用户。您也可以只存储每个用户的UID,然后在必要时获取用户。然后,在&#39;对话&#39;内部文档,您将在两个用户之间收集消息。这是我将采取的一种方法,如果您需要更多帮助,我可以创建模型服务和数据结构作为示例。简而言之,首先存储会话将有助于此处的结构。
以下是我将如何设置Firestore结构的示例:
在对话集合中,我将向用户存储一个DocumentReferences数组,然后有一个与此对话相关的消息集合。
现在在users集合中,我将为每个用户提供一个文档,其中Document Id是来自经过身份验证的用户的UID。这似乎是多余的,但我还会在用户集合中创建一个对话集合,其中每个文档只有一个字段,该字段是对话文档的DocumentReference。以下是convos集合中该文档的示例:
通过这种方式,您可以阻止用户在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)。它使用一个与消息的对话作为文档。