首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >修复数组查询超过10个元素(分页)

修复数组查询超过10个元素(分页)
EN

Stack Overflow用户
提问于 2020-03-10 19:58:13
回答 3查看 1.2K关注 0票数 2

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

代码语言:javascript
复制
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规则有任何想法吗?也许我应该在集合中添加另一个数组,名为PhoneNumbers2,用于来宾9-18,PhoneNumbers3用于19-28?

如果你有什么想法请告诉我!(我不能添加一个名为来宾的新集合,因为这个应用程序允许您邀请未经身份验证的人,如果有意义的话,我需要能够查询这些数字而没有UID )。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2021-03-25 08:27:33

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

代码语言:javascript
复制
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:将内容拆分为块

代码语言:javascript
复制
    let chunkedArray = ids.chunked(into: 10)

步骤3:迭代块数组并执行您的防火墙查询

代码语言:javascript
复制
 chunkedArray.forEach
 { ids in

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

Stack Overflow用户

发布于 2020-03-10 21:17:50

我认为您需要去掉其中的"query =“部分,只需在if- get语句中直接获取文档。在我的测试中,这还了17份文件。我使用不同的集合名称和字段名,但结构完全相同。

代码语言:javascript
复制
Firestore.firestore().collection("users").whereField("PhoneNumber", in: array).order(by: "Full Name").getDocuments { (snapshot, error) in
        print(snapshot?.documents.count)
    }
票数 0
EN

Stack Overflow用户

发布于 2021-07-08 05:38:10

根据firebase文档,它只支持where字段中最多10个it,用于查询超过10个元素--我们需要单独查询每个文档,或者将数组拆分为10个it的块。

用于单独查询每个项目。检查下面的代码,

代码语言:javascript
复制
let usersPromise = [];

usersIds.map((id) => {
    usersPromise.push(firestore.collection("users").doc(id).get());
});
        
Promise.all(usersPromise).then((docs) => {
    const users = docs.map((doc) => doc.data());
    
    // do your operations with users list
});
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/60625055

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档