我正在使用 Firestore 实现聊天。这是 Firestore 的结构:
|- 聊天记录(合集)
|-- AutoID(文档)
|--- user1ID(字符串)
|--- 用户2ID(字符串)
|--- 线程(集合)
...然后 thread 有更多的字段。
为了在两个用户之间进行聊天,我正在获取它:
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 (String)
|--- 线程(集合)
...然后 thread 有更多的字段。
但是当我这样做的时候:
let db2 = Firestore.firestore().collection("Chats")
.whereField("users", arrayContains: Auth.auth().currentUser?.uid!)
.whereField("users", arrayContains: user2UID!)
它将获取它找到的第一个具有 currentUser.uid
的文档 (还没有测试过,我是根据我读过的文档说的)。
那么,如果一个数组包含两个 id,我怎样才能得到这个聊天呢?
最佳答案
首先,您概述的文档没有任何数组类型字段,因此 arrayContains 不会有帮助。 arrayContains 仅匹配包含数组的字段的项目。
对于您当前的文档结构,单个查询将无法获取两个用户之间的所有文档,因为 Cloud Firestore doesn't offer any logical OR type queries .您将需要两个查询:一个用于获取 user1 是当前用户的所有文档,一个用于 user2 是当前用户的文档。然后您可以在客户端代码中合并这两个查询的结果以构建整个列表。
关于ios - 或者在 whereField 中从 Firestore 中获取文档,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58427964/