首页 > 解决方案 > 在 FirebaseFirestoreSwift 中处理 documentID 真的很令人困惑

问题描述

我必须查询大量集合,并且模型总是这样定义:

struct Order : Identifiable, Codable {

    @DocumentID var id : String?
    
    let fieldOne : String?
    let fieldTwo : Int?

    enum CodingKeys : String, CodingKey {
        case id // (had to comment this out)
        case fieldOne
        case fieldTwo
    }
}

今天,我花了一整天的时间试图弄清楚为什么我不能从一个特定的集合中加载文档。我正在获取包含文档的快照,但无法将它们转换并填充到数组中。经过数小时的反复试验,我在枚举中注释掉了“case id”并让它工作。

知道为什么会这样吗?

这是一个适用于案例 ID 的查询:

listener = db.collection("Meal_Plans").whereField("userId", isEqualTo: userEmail).order(by: "timeOfCreation", descending: true).addSnapshotListener({ (querySnapshot, error) in
            if let error = error {
                print("error in mp query: \(error.localizedDescription)")
            } else {
                guard let documents = querySnapshot?.documents else {
                    print("No mealplans")
                    return
                }
                let mealplanArray: [Mealplan] = documents.compactMap { queryDocumentSnapshot -> Mealplan? in
                  return try? queryDocumentSnapshot.data(as: Mealplan.self)
                }
                let planViewModel = mealplanArray.map({return PlanViewModel(mealplan: $0)})
                DispatchQueue.main.async {
                    if mealplanArray.count > 0 {
                        self.planViewModelDelegate?.plansFetched(self.updateHour(sourcePlans: planViewModel))
                    }
                }
            }
    })

这是一个没有:

listener = db.collection("Placed_Orders").whereField("userId", isEqualTo: userId).whereField("status", isLessThan: 410).order(by: "status", descending: false).order(by: "nextOrderDate", descending: false).addSnapshotListener({ (documentSnapshot, error) in
            if let error = error {
                print("error")
                self.orderCallback?(error.localizedDescription, nil, .error)
            } else {
                print("empty")
                guard let documents = documentSnapshot?.documents else {
                    return }
                if documents.isEmpty {
                    self.orderCallback?("No orders found", nil, .error)
                    return
                } else {
                    print("snapshot count: \(documents.count)")
                    let orderArray: [Order] = documents.compactMap { queryDocumentSnapshot -> Order? in
                      return try? queryDocumentSnapshot.data(as: Order.self)
                    }
                    let orderViewModel = orderArray.map({ return OrderViewModel(order: $0)})
                    print("array count: \(orderArray.count)")
                    DispatchQueue.main.async {
                        print("status: \(orderViewModel)")
                        self.orderCallback?(nil, orderViewModel, .success)
                    }
                }
            }
        })

差异相当微妙。在这两种情况下,我都使用快照侦听器来查询快照并将其填充到数组中,然后将该数组映射到视图模型中。

然而,在后一种情况下,我必须注释掉可识别字段的案例 ID。我需要 ID,所以需要查看它是否有效,但想知道为什么我必须注释掉案例 ID。

标签: swiftgoogle-cloud-firestore

解决方案


推荐阅读