ios - 或者在 whereField 中从 Firestore 中获取文档

标签 ios swift firebase google-cloud-firestore

我正在使用 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/

相关文章:

ios - UIView 扩展获取 UITableViewCell?

javascript - Firebase:如何将表单数据提交到不同的集合?

ios - 在Xamarin iOS应用程序的PCL内包含内容文件

ios - 处理 UIImage 事件动画?

iPhone UI国际化

ios - 如何在一个类或 .swift 文件中编写一个方法并在整个代码中调用该方法?

ios - 添加 SceneKit 场景文件到 View Controller

Swift 3/Xcode 文本对齐到 imageview

google-maps - 带有 Google Maps API 的云函数

angular - Firebase 存储 putString 方法