Обработка documentId в FirebaseFirestoreSwift действительно сбивает с толку

#swift #google-cloud-firestore

# #swift #google-облако-firestore

Вопрос:

Мне нужно запросить множество коллекций, и модели всегда определяются примерно так:

 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
    }
}
 

Сегодня я потратил весь день, пытаясь понять, почему я не могу загрузить документы из одной конкретной коллекции. Я получал снимок с документами, но не мог преобразовать и заполнить их в массив. После нескольких часов проб и ошибок я закомментировал «идентификатор обращения» в перечислении и заставил его работать.

Есть идеи, почему это происходит?

Вот запрос, который работает С идентификатором обращения:

 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)
                    }
                }
            }
        })
 

Различия довольно тонкие. В обоих случаях я использую прослушиватель моментальных снимков для запроса моментального снимка и заполнения его в массив, а затем отображения этого массива в модель представления.

Тем не менее, в последнем случае я должен закомментировать идентификатор обращения для идентифицируемого поля. Мне нужен идентификатор, поэтому мне нужно посмотреть, работает ли он, но я хотел бы знать, почему я должен комментировать идентификатор обращения.