【问题标题】:Cloud Firestore - Slow performance with looped getDocument request (500+ documents) (Swift)Cloud Firestore - 循环 getDocument 请求(500 多个文档)(Swift)的性能缓慢
【发布时间】:2017-10-12 10:59:12
【问题描述】:

我正在编写一个函数,该函数从 API 调用中提取信息,解析生成的 JSON,循环遍历每个结果项,然后在以下视图控制器上显示此信息。在这个循环中,我必须从 Firestore 数据库中提取每个项目的信息。

我正在使用 Swift 4 和 Firestore 0.8.0

下面的代码是我到目前为止一直在使用的代码,它考虑了我们的数据库中是否可能不存在一个项目,只有当所有 Firestore 请求都完成时才会发生转场:

for item in results {
    dispatch.enter()
    //Main loop code for processing the API Call & pulling the document ID for this item

    let docRef = db.collection("collection").document(documentID)
    docRef.getDocument { (document, error) in
        if (document?.exists ?? false), error == nil {
            if let document = document {
                let data = document.data()
                print("EXISTS")
                //do things
                dispatch.leave()
            } else {
                print("Document does not exist")
                dispatch.leave()
            }
        } else {
            print("DOES NOT EXIST") 
            //do other things
            dispatch.leave()
        }
    }
}
dispatch.notify(queue: .main) {
    //perform a segue to the data display VC
}

(代码是使用这个问题编写的 -> Crashes with Firestore,如果您的集合中不存在文档,目前 Firestore 最初不会返回 nil 值)

我遇到的问题是这个功能最终需要几分钟才能完成。有没有更快的方法来执行这个循环的文档请求?这只是测试版性能吗?

我们的 Firestore 集合最终将拥有超过 1,000,000 个文档,并且从每个文档中提取的字段具有如下嵌套来源:

collection {
    document {
        object {
           item1: data to pull
           item2: data to pull
           ...etc
        }
    }
}

任何帮助将不胜感激!

更新和结论

似乎我对此采取了相反的方法!由于我们数据库的性质意味着我们存储 API 数据的所有文档,因此我可以在 Firestore 数据库上执行单个查询以限制数据,然后强制 API 调用仅返回基于初始查询找到的文档的结果。这样就无需检查我们的数据库中是否存在任何 API 调用结果文档!轻轻松松!

【问题讨论】:

  • 您是否有理由不能只加载整个集合,而不是循环并一次加载一个文档?
  • @MorganChen 如果您指的是 getDocuments,那么它在用户设备上的性能会非常高。他们将加载 1,000,000 个 50kb 大小的文档,以便从每个文档中显示大约 5kb 的数据,大约 500-1,000 个结果
  • 我可能有误会,但是您是否有理由不能将查询限制为仅加载 500-1000 个结果而不是加载全部 1000000 个结果?
  • 我们可以通过这种方式查询数据库条目的唯一方法是通过我们的 API 调用收集的 id 字段。这取决于是否可以从这样的 id 数组进行查询,并且可以从查询中执行单个 getDocuments。从 API 调用结果中收集的 id 不断变化
  • 全部排序!有关详细信息,请参阅我的问题更新 - 问题在于我自己调用 API 的方法

标签: ios swift loops firebase google-cloud-firestore


【解决方案1】:

我认为问题在于您向数据库发出了 500 多个单独的提取请求。无论如何,这可能会很慢。

我会寻找可以将这些数据放入集合中的方法,然后查询集合以获取所需的文档。这至少可以让您通过一次调用获得这些数据(或者,如果您不需要一次全部 500 个文档,则更好的是获得分页数据)

【讨论】:

  • 我同意,因为无论如何我们都将这些文档存储在我们的数据库中,我发现我可以强制 API 调用仅返回我们数据库中存在的文档的信息。似乎我对此采取了相反的方法,实际上我根本不需要检查这些文档是否存在于我们的数据库中!简单的数据扁平化和一个查询,然后是 API 调用就可以完成这项工作
猜你喜欢
  • 1970-01-01
  • 2022-11-11
  • 2019-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-11-08
  • 2013-06-02
  • 2017-04-03
相关资源
最近更新 更多