【问题标题】:angular firebase one to one chat. creating works, retrieving doesn't?角度火力一对一聊天。创作作品,检索不?
【发布时间】:2019-12-03 22:27:00
【问题描述】:

我正在尝试使用 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)
 ]);

我尝试查看是否可以在添加集合时设置像“名称”这样的字段,但我认为 doc(uid).set({name: 'name'}).collection() 无法做到这一点,因为设置是一个承诺。任何帮助或指导将不胜感激。请让我知道我做错了什么,如果可能有更好和/或优化的方法,我很乐意欢迎它

【问题讨论】:

  • 有什么问题?
  • @PeterHaddad 正在检索文档中的集合。我不确定这是否可能。
  • 如果你这样做return this .afs.collection('chats').snapshotChanges() .pipe( map(r => { console.log(r); }) );你会得到什么?
  • 它获取“聊天”集合中的所有文档。即user1UID、user2UID、user3UID。但我想获取特定用户 ID 下的子集合
  • 你可以记录uid并检查该值是否在数据库中

标签: angular typescript firebase google-cloud-firestore


【解决方案1】:

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

您最好的选择是:

  1. 更改您的数据模型以在用户的​​文档中包含对话列表。这样,您只需阅读此文档即可确定对话列表,然后在用户单击其中一个时阅读必要的集合。

    您通常还希望在此文档中包含有关每个对话的一些主要信息,例如上次更新时间(以便您可以首先显示最近更新的对话),以及每个对话的最后一条消息.

  2. 创建一个返回对话列表的云函数,因为服务端 SDK确实具有列出集合的功能。不过,在这种情况下,我建议您不要这样做,因为您仍然需要我在另一个选项中提到的每个对话的附加信息。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-09-24
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-12-12
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多