首页 > 解决方案 > Firestore Array 查询超过 10 个元素(分页)

问题描述

我正在尝试获取存储在名为“PhoneNumbers”的数组中的派对的所有客人。每个邀请都会将该人的电话号码添加到数组中。如果有超过 10 个邀请应用程序崩溃,因为这是 Firestore 的限制。

fileprivate func fetchGuests() {
        print("hi hi")
        guard !fetchedAllUsers, !fetchingMoreUsers else { return }
        fetchingMoreUsers = true
        tableView.reloadSections(IndexSet(integer: 1), with: .none)

        let partyUID = self.party?.partyUID ?? ""
        navigationItem.title = "\(party?.partyName ?? "") Guests"

        Firestore.firestore().collection("parties").document(partyUID).getDocument { (snap, err) in
            if let err = err {
                print(err, "fook")
            }
            guard let partyDict = snap?.data() else {return}
            let party = Party(dictionary: partyDict)

            self.phoneNumbers = party.guestPhoneNumbers as! [String]
            print(self.phoneNumbers)


        var query: Query
            if let lastFetchedNumber = self.lastFetchedNumber {
                query = Firestore.firestore().collection("users").whereField("PhoneNumber", in: self.phoneNumbers).order(by: "Full Name").start(after: [lastFetchedNumber]).limit(to: 9)

        } else {
            query = Firestore.firestore().collection("users").whereField("PhoneNumber", in: self.phoneNumbers).order(by: "Full Name").limit(to: 9)
        }

        // Change logic where gender variable is just the where field firebase thing
        query.getDocuments { (snapshot, err) in ......yadayadayada

有人对如何解决最大 10 规则有任何想法吗?也许我应该为客人 9-18 和 PhoneNumbers3 为 19-28 的集合添加另一个数组?

如果您有任何想法,请告诉我!(我无法添加一个名为 guest 的新集合,因为此应用程序允许您邀请未经身份验证的人,并且如果有意义,我需要能够在没有 UID 的情况下查询这些号码)

标签: swiftfirebasegoogle-cloud-firestorepagination

解决方案


第 1 步:添加数组扩展以获取数组块

extension Array {
func chunked(into size: Int) -> [[Element]] {
    return stride(from: 0, to: count, by: size).map {
        Array(self[$0 ..< Swift.min($0 + size, count)])
    }
}
}

第 2 步:将内容拆分为块

    let chunkedArray = ids.chunked(into: 10)

第 3 步:迭代块数组并执行您的 firestore 查询

 chunkedArray.forEach
 { ids in

   let query = db.collection("TABLE_NAME").whereField("KEY_ID" , in: ids )
 //your firestore query request here 
 }

推荐阅读