ios - 如何进行单个查询以从 Cloud Firestore 集合的两个差异中检索数据?

标签 ios swift google-cloud-firestore

亲爱的 Swift 和 Cloud firestore 开发者, 我正在使用 swift 和云 firestore 数据库开发聊天应用程序。这是我的收藏:

Messages:
    + senderId
    + serceiverId
    + text
    + date
Users
    + userId
    + name
    + email
    + profilePic
    + phoneNumber
    + date

假设我正在登录,我的问题是我想列出与我有聊天记录的所有用户(profilePicname)。 但是有什么方法可以仅使用 Firestore 的单个查询来检索用户列表吗?

这是我当前的代码:

            var usersList : [User]! 

            private lazy var usersRef = Firestore.firestore().collection("Users") 

            private lazy var messagesRef = Firestore.firestore().collection("Messages")

            var uid = Auth.auth().currentUser?.uid as! String 

            messagesRef.whereField("senderId", isEqualTo: uid).order(by: "date_modified", 
            descending:true).addSnapshotListener { (querySnapshot, error) in 

                if let error = error { 

                    print("Error getting documents: \(error)")

                } else { 

                    guard let snapshot = querySnapshot else { 

                        print("Error fetching snapshots: \(error!)") 
                        return 
                    } 

                    snapshot.documentChanges.forEach { diff in 
                        if (diff.type == .added) { 
                            let da = diff.document.data() as! NSDictionary 

                            let receiverId = da["receiverId"] as! String 
                            self.usersRef.whereField("userId", isEqualTo:  
             receiverId).getDocuments(completion: { (udata, error) in 

                                for document in udata!.documents { 
                                    let du:[String:Any] = document.data() 

                                    let name = du["name"] as! String 
                                    let email = du["email"] as! String 
                                    self.usersList.append(User(userId: receiverId, name: 
             name, email:email)) 
                                    self.tableView.reloadData() 

                                } 

                            }) 

                        } 

                      } 

                   } 

                } 

            }

最佳答案

无法通过一次读取从两个集合中获取数据。您必须:

  1. 将每个用户的必要数据复制到他们的每条消息中(称为非规范化),或

  2. 执行额外的读取来获取用户数据,称为客户端连接。

这两种情况在 NoSQL 数据库上都是非常正常的。如果您对这个概念不熟悉,我建议:

关于ios - 如何进行单个查询以从 Cloud Firestore 集合的两个差异中检索数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49675846/

相关文章:

java - Firestore - 检查正在更新的文档是否存在

google-cloud-firestore - onSnapshot : FirebaseError: [code=invalid-argument]: transaction closed 中的错误

ios - 如何使用“app access_token”删除应用得分?

ios - 无法下载 gzip 文件的 bin 文件

iphone - 用户单击 "assistance"图标后模式文本弹出的最佳方法?

ios - 完成 block 方法与DispatchQueue

ios - 在Swift中将逗号和十进制后的零值添加到千位数后的字符串中

ios - 参数中的额外调用 - Swift

ios - Swift 中的自动换行标签

java - 在 Firestore 中获取服务器时间戳时出错