【问题标题】:OR in whereField to fetch a document from Firestore或在 whereField 中从 Firestore 获取文档
【发布时间】:2020-02-14 02:23:44
【问题描述】:

我正在使用 Firestore 实现聊天。 Firestore的结构如下:

|- 聊天(收藏)
|-- AutoID(文档)
|--- user1ID(字符串)
|--- user2ID(字符串)
|--- 线程(收藏)
...然后线程有更多的字段。

为了在两个用户之间进行聊天,我像这样获取它:

let db = Firestore.firestore().collection("Chats")
    .whereField("user1ID", isEqualTo: Auth.auth().currentUser?.uid!)
    .whereField("user2ID", isEqualTo: user2UID!)

如果用户 1 是当前用户,它可以正常工作,否则如果我从其他帐户打开聊天并且当前用户是用户 2,它不会获取此文档。

搜索后发现我可以使用arrayContains。所以我创建了一个名为users 的数组,并在其中添加了这两个ID。所以现在的结构是: |- 聊天(收藏)
|-- AutoID(文档)
|--- 用户(数组)
|---- 0: user1ID(字符串)
|---- 1: user2ID(字符串)
|--- 线程(收藏)
...然后线程有更多的字段。

但是当我这样做时:

let db2 = Firestore.firestore().collection("Chats")
    .whereField("users", arrayContains: Auth.auth().currentUser?.uid!)
    .whereField("users", arrayContains: user2UID!)

它将获取它发现的第一个具有currentUser.uid 的文档(尚未对其进行测试,我是根据我阅读的文档说的)。

那么,如果一个数组包含两个 id,我怎样才能得到这个聊天?

【问题讨论】:

  • 有几个很好的答案,但我的问题是,get chat between two users 是什么意思?换句话说,你会在什么时间点得到两个用户之间的聊天——两个用户都得到了吗?还是只是其中之一?它何时发生 - 当他们第一次进行身份验证时或之后的某个时间。他们是否单击“获取我的聊天”按钮,或者他们参与的聊天是否在 tableView 中提供?聊天中只有两个人还是两个以上?可能还有其他选项提供更多信息。

标签: ios swift firebase google-cloud-firestore


【解决方案1】:

首先,您概述的文档没有任何数组类型字段,因此 arrayContains 不会有帮助。 arrayContains 仅匹配包含数组的字段的项目。

对于您当前的文档结构,单个查询将无法获取两个用户之间的所有文档,因为 Cloud Firestore doesn't offer any logical OR type queries。您将需要两个查询:一个用于获取 user1 是当前用户的所有文档,一个用于获取 user2 是当前用户的文档。然后您可以在客户端代码中合并这两个查询的结果来构建整个列表。

【讨论】:

    【解决方案2】:

    我通常会为正在聊天的两个用户命名文档。这样您就不需要查询来查找文档,而是可以直接访问基于 UID。

    为了确保指定 UID 的顺序无关紧要,然后我按字典顺序添加它们。有关此示例,请在此处查看我的答案:Best way to manage Chat channels in Firebase

    【讨论】:

      猜你喜欢
      • 2018-09-03
      • 2022-01-20
      • 1970-01-01
      • 2019-07-04
      • 2022-01-06
      • 2019-06-07
      • 1970-01-01
      • 1970-01-01
      • 2020-12-03
      相关资源
      最近更新 更多