或在whereField中从Firestore提取文档

时间:2019-10-17 08:18:07

标签: ios swift firebase google-cloud-firestore

我正在使用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,该如何聊天?

2 个答案:

答案 0 :(得分:1)

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

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

答案 1 :(得分:1)

我通常要做的是为正在聊天的两个用户命名文档。这样,您无需查询即可找到文档,而可以直接基于UID进行访问。

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