首页 > 解决方案 > 无法使用 Collection 检索 Firestore 文档

问题描述

您能否查看以下内容并帮助我理解为什么我的文档无法从 Firestore 中检索?我的代码如下:

class ContactStore : ObservableObject {
    
    @Published var datas = [contactDataType]()
    
    private var db = Firestore.firestore()
    
    func fetchData() {
        
      db.collection("Contact Details").addSnapshotListener { (querySnapshot, error) in
        guard let documents = querySnapshot?.documents else {
          print("No documents")
          return
        }
          
        self.datas = documents.compactMap { queryDocumentSnapshot -> contactDataType? in
          return try? queryDocumentSnapshot.data(as: contactDataType.self)
        }
      }
    }
}

我的结构如下

struct contactDataType : Identifiable, Codable {
    
    @DocumentID var id: String? = UUID().uuidString
    var adno : String
    var fullname : String
    var firstname : String
    var lastname : String
    var registrationgroup : String
    var priority1relation : String
    var priority1fullname : String
    var priority1maintelephone : String
    var priority1mobile : String
    var priority2relation : String
    var priority2fullname : String
    var priority2maintelephone : String
    var priority2mobile : String
    var priority3relation : String
    var priority3fullname : String
    var priority3maintelephone : String
    var priority3mobile : String
    var priority4relation : String
    var priority4fullname : String
    var priority4maintelephone : String
    var priority4mobile : String

我可以使用以下代码检索文档,

class ContactStore : ObservableObject{

    @Published var datas = [contactDataType]()
    @AppStorage("selectedSchool") var selectedSchool: String = "selectedSchool"


    init() {

        let db = Firestore.firestore()

        db.collection("School Name/\(selectedSchool/School Assets/\(**Struggling with this bit**)/Contact Details").getDocuments { (snap, err) in

            if err != nil{

                print((err?.localizedDescription)!)
                return
            }

            for i in snap!.documents{

                let id = i.documentID
                let adno = i.get("ID") as? String ?? ""
                let fullname = i.get("Full Name") as? String ?? ""
                let firstname = i.get("First Name") as? String ?? ""
                let lastname = i.get("Last Name") as? String ?? ""
                let registrationgroup = i.get("Registration Group") as? String ?? ""
                let priority1relation = i.get("Priority 1 Relation") as? String ?? ""
                let priority1fullname = i.get("Priority 1 Full Name") as? String ?? ""
                let priority1maintelephone = i.get("Priority 1 Main Telephone") as? String ?? ""
                let priority1mobile = i.get("Priority 1 Mobile") as? String ?? ""
                let priority2relation = i.get("Priority 2 Relation") as? String ?? ""
                let priority2fullname = i.get("Priority 2 Full Name") as? String ?? ""
                let priority2maintelephone = i.get("Priority 2 Main Telephone") as? String ?? ""
                let priority2mobile = i.get("Priority 2 Mobile") as? String ?? ""
                let priority3relation = i.get("Priority 3 Relation") as? String ?? ""
                let priority3fullname = i.get("Priority 3 Full Name") as? String ?? ""
                let priority3maintelephone = i.get("Priority 3 Main Telephone") as? String ?? ""
                let priority3mobile = i.get("Priority 3 Mobile") as? String ?? ""
                let priority4relation = i.get("Priority 4 Relation") as? String ?? ""
                let priority4fullname = i.get("Priority 4 Full Name") as? String ?? ""
                let priority4maintelephone = i.get("Priority 4 Main Telephone") as? String ?? ""
                let priority4mobile = i.get("Priority 4 Mobile") as? String ?? ""


                self.datas.append(contactDataType(id: id, adno: adno, fullname: fullname, firstname: firstname, lastname: lastname, registrationgroup: registrationgroup, priority1relation: priority1relation, priority1fullname: priority1fullname, priority1maintelephone: priority1maintelephone, priority1mobile: priority1mobile, priority2relation: priority2relation, priority2fullname: priority2fullname, priority2maintelephone: priority2maintelephone, priority2mobile: priority2mobile, priority3relation: priority3relation, priority3fullname: priority3fullname, priority3maintelephone: priority3maintelephone, priority3mobile: priority3mobile, priority4relation: priority4relation, priority4fullname: priority4fullname, priority4maintelephone: priority4maintelephone, priority4mobile: priority4mobile))
            }
        }
    }
}

Firebase 结构

**因此,总的来说,我正在努力将文档 ID 传递到第二个代码中的路径中,或者使用第一个代码检索我的文档。我知道使用第一个会更好,但我真的很想将文档 ID 传递到文档路径中,而不是创建集合组查询,因为它似乎与我想做的不匹配。

我了解命名结构不太正确,应避免使用空格**

此时此刻,我已经制定了让所有人阅读的规则,所以我知道这不是安全问题。

问题 -

  1. 我可以将文档 ID 传递到路径中吗?我不确定,也找不到任何相关文档,尽管我已经通过 AppStorage for Selected School 进行了管理

  2. 集合组查询是更好的方法吗?

感谢您的任何建议。

标签: swiftfirebasegoogle-cloud-firestore

解决方案


如果您无法构建要查询的子集合的完整路径,包括所有嵌套文档 ID,那么您将无法直接查询它。需要完整路径 - 没有通配符。

如果知道子集合的名称,您可以进行集合组查询,这将查询具有完全相同名称的所有子集合。如果您不想要所有这些子集合中的所有文档,您可以过滤查询以找到您要查找的内容。


推荐阅读