【问题标题】:How to fetch documents from two different subcollections如何从两个不同的子集合中获取文档
【发布时间】:2022-10-12 21:41:00
【问题描述】:

我正在尝试为汽车保养笔记创建一个小应用程序。 现在我想从 Firestore 数据库中获取所有汽车维修记录,但我的代码无法正常工作。 我有一个集合“车辆”。该集合存储所有车辆文件。每辆车都有一个子集合“MaintenanceItems”,在这个子集合中,有一些文档。我需要为每辆车获取“MaintenanceItems”中的所有文档并将它们显示在屏幕上。 我为它写了“ExpensesManager”类,但是有一个问题。添加新的维护项目后,我得到了重复项。

import Foundation
import FirebaseFirestore
import FirebaseFirestoreSwift

class ExpensesManager: ObservableObject {
    private(set) var expenses = [MaintenanceItem]()
    @Published private(set) var expenseItems = [MaintenanceItem]()
    let db = Firestore.firestore()
    
    init(vehicles: [Vehicle]) {
        fetchExpenseItems(vehicles: vehicles)
        print("ExpensesManager init func succeess!")
    }
    
    func fetchExpenseItems(vehicles: [Vehicle]) {
        for vehicle in vehicles {
            guard let vehicleID = vehicle.id else {
                print("VehicleID is not found")
                return
            }
            
            db.collection("Vehicles").document("\(vehicleID)").collection("MaintenanceItems").addSnapshotListener { querySnapshot, error in
                guard let documents = querySnapshot?.documents else {
                    print("Error fetching documents: \(String(describing: error))")
                    return
                }
                
                print("Documents are received")
                
                self.expenses = documents.compactMap { document -> MaintenanceItem? in
                    do {
                        return try document.data(as: MaintenanceItem.self)
                    } catch {
                        print("Error decoding document into Expense: \(error)")
                        return nil
                    }
                }
                
                for expense in self.expenses {
                    self.expenseItems.append(expense)
                }
                
                print("Expenses array is completed")
            }
        }
    }
}

【问题讨论】:

    标签: swift firebase google-cloud-platform google-cloud-firestore


    【解决方案1】:

    我需要为每辆车获取“维护项目”中的所有文档并将它们显示在屏幕上。

    如果您需要获取所有MaintenanceItems 集合中存在的所有文档,基本上是所有车辆的维护项目,那么您应该考虑使用collection group query

    db.collectionGroup("MaintenanceItems").addSnapshotListener { /*...*/ }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-07-12
      • 1970-01-01
      • 1970-01-01
      • 2018-06-10
      • 2019-12-27
      • 2021-09-28
      相关资源
      最近更新 更多