如何访问以 Firebase 创建的 UUID 命名的子集合

问题描述 投票:0回答:1

我创建了如下所示的结构。

`func sendMessage(_ message: Message) {
    let document = db.collection("messages")
        .document(message.senderId)
        .collection(message.receiverId)
        .document()
    
    let messageData = ["fromId": message.senderId, 
   "toId": message.receiverId, "content":  message.content, 
   "timestamp": message.timestamp] as [String : Any]
    
    document.setData(messageData) { error in
        if let error = error {
            print("ERROR SAVING MESSAGE INTO FIRESTORE \(error.localizedDescription)")
            return
        }
    }
    
    let recipientMessageDocument = db.collection("messages")
        .document(message.receiverId)
        .collection(message.senderId)
        .document()
    
    recipientMessageDocument.setData(messageData) { error in
        if let error = error {
            print("ERROR SAVING MESSAGE INTO FIRESTORE \(error.localizedDescription)")
            return
        }
    }`

并成功获取消息,如下所示:

`func fetchMessages(_ fromId: String, _ toId: String) {
    db.collection("messages")
        .document(fromId)
        .collection(toId)
        .addSnapshotListener { querySnapshot, error in
            if let error = error {
                print("FAILED TO LISTEM FOR MESSAGES: \(error.localizedDescription)")
                return
            }
            
            querySnapshot?.documentChanges.forEach({ change in
                if change.type == .added {
                    let data = change.document.data()
                    DispatchQueue.main.async {
               let newMessage = ChatMessage(documentId: change.document.documentID, data: data)
                    self.messages.append(newMessage)
                    }
                }
            })
        }`

Firebase Structure 但是当我想拉出我在下面的图片中圈出的所有receiverId时,我收到“文档不存在”错误。我怎样才能获得这些receiverId?

这就是我尝试获取receiverIds的方法。实际上这个函数是为了获取用户名,但是在函数的开头我无法获取子集合的内容。

`func addReceiverNamesToMessages(for userId: String) { 让组 = DispatchGroup()

    db.collection("messages")
        .document(userId)
        .getDocument { document, error in
            if let document = document, document.exists {
                if let data = document.data() {
                    let receiverIds = Array(data.keys)
                    
                    for receiverId in receiverIds {
                        group.enter()
                        self.userProfileService.fetchUserProfile(uid: receiverId) { result in
                            switch result {
                            case .success(let profile):
                                DispatchQueue.main.async {
                                    self.chatUser.append(profile)
                                }
                            case .failure:
                                break
                            }
                            group.leave()
                        }
                    }
                    
                    group.notify(queue: .main) {
                        print("All profiles fetched")
                    }
                }
            } else {
                print("Document does not exist")
            }
        }`
swift firebase google-cloud-firestore swiftui
1个回答
0
投票

您在“消息”下显示的任何文档都不存在。因此,它们不会出现在使用 iOS SDK 对该集合进行的任何查询中。 您仍然可以查询嵌套在这些缺失文档下的子集合,但您必须提前知道(缺失)文档 ID。

请参阅文档

即使文档的一个或多个祖先不存在,它也可以存在。 例如,路径 /mycoll/mydoc/mysubcoll/mysubdoc 处的文档可以 即使祖先文档 /mycoll/mydoc 不存在,也存在。云端 Firestore 数据查看器将不存在的祖先文档显示为 如下:

  • 在集合的文档列表中,不存在的祖先文档的文档 ID 以斜体显示。
  • 在不存在的祖先文档的信息面板中,数据查看器指出该文档不存在。

另请参阅:

© www.soinside.com 2019 - 2024. All rights reserved.