角火力基地一对一聊天。创建作品,检索不是吗?

问题描述 投票:0回答:2

[我正在尝试使用angular和firebase创建一对一的聊天,我遵循了我在stackoverflow和firebase文档上看到的一个模型,该模型基本上是collection().doc().collection().add()

我最终得到这样的东西

chats
  user1UID
    user1UID_user2UID
    user1UID_user3UID
  user2UID
    user1UID_user2UID
    user1UID_user3UID
  user3UID
    user1UID_user3UI

但是由于某些原因,尝试通过uid的路径检索聊天室不起作用,并返回空

return this
  .afs.collection('chats')
  .doc(uid)
  .snapshotChanges()
  .pipe(
    map(r => {
      console.log(r);
    })
  );

我注意到ID斜体,并且进一步查看它,我发现是这样的,因为文档中没有字段,并且必须手动创建文档才能注册并“不是虚拟的”。尽管我是通过代码创建聊天的。

 const dRef = this.afs.collection('chats');
 const c = Promise.all([
  dRef.doc(uid).collection(`${uid}_${r_id}`).add(data),
  dRef.doc(r_id).collection(`${r_id}_${uid}`).add(r_data)
 ]);

我试图查看是否可以在添加集合时设置'name'之类的字段,但我不认为doc(uid).set({name: 'name'}).collection()可能会因为设置为承诺而发出警告。任何帮助或指导将不胜感激。请让我知道我在做错什么,如果有可能采用更好和/或优化的方法,我将很高兴欢迎它

angular typescript firebase google-cloud-firestore
2个回答
0
投票

更改此:

return this
  .afs.collection('chats')
  .doc(uid)
  .snapshotChanges()
  .pipe(
    map(r => {
      console.log(r);
    })
  );

进入此:

return this
  .afs.collection('chats',ref => ref.where('uid', '==', uid))
  .snapshotChanges()
  .pipe(
    map(r => {
      console.log(r);
    })
  );

在消防站中,您有userChatRooms,没有chats


0
投票

如果我对您的理解正确,您正在尝试通过查询来检索用户文档的子集合,这在客户端SDK中是不可能的。 (请参见:How to list subcollections in a Cloud Firestore documentHow to list subcollection on firestore?

您最好的选择是:

  1. 更改您的数据模型以将对话列表包含在用户的[[document中]。这样,您可以通过仅阅读本文档来确定对话列表,然后在用户单击其中的一个时阅读必需的集合。

    您通常还会在文档中包括有关每个会话的一些主要信息,例如上次更新时间(以便您可以首先显示最近更新的会话),以及每个会话的最后一条消息。
  2. 创建一个返回对话列表的Cloud Function,因为服务端SDK

    do具有列出集合的功能。不过,在这种情况下,我还是建议不要这样做,因为您仍然需要我在另一个选项中提到的每个会话的其他信息。

© www.soinside.com 2019 - 2024. All rights reserved.