我正在开发一个项目,需要从 Firestore 获取大型数据集来显示患者数据。数据结构如下:患者/每日(集合)//文档,其中每个文档包含摘要和样本字段。我的目标是有效地读取这些数据以将其显示在我的应用程序中。
问题:
无论我采用哪种方法,获取重要间隔的数据(例如,过去 2 年、回溯到 2 年前的 3 个月间隔,或 3m、3m、6m、1y 等组合),操作始终需要超过 30 秒,这远非最佳。我正在寻找一种方法来显着减少这种延迟。
我尝试过的:
问题:
const collectionRef = collection(db, "patients", id, "daily");
const startDateStr = startDate.toISOString().split("T")[0];
const q = query(
collectionRef,
where("start_time", ">=", startDateStr),
where("start_time", "<", endDateStr)
);
const querySnapshot = await getDocs(q);
在此之后,我检查每个快照以将摘要和样本检索到 2 个不同的数组中,一个用于摘要,一个用于样本。
我期望通过将获取操作分解为更小的间隔或通过批处理,我可以减少整体延迟。然而,这些方法都没有将获取时间减少到 30 秒以下。
文档数和数据量:每次查询检索 556 个文档,总数据大小约为 110.6 MB。文档中有很多数据没有使用,我们正在考虑将这些文档移动到仅包含摘要/样本的集合中。
网络带宽:(97.84) Mbps 下载速度(由 Speedtest.net 测量)。
加载数据需要 35 - 45 秒。
在为 NoSQL 数据库建模数据时遵循的一般原则是尝试仅检索应用程序立即显示到数据的数据。
您说您检索了 556 个文档,这似乎有很多文档要完全显示给用户 - 并且您已经承认这些文档中的很多数据没有显示给用户。那么为什么要检索这些数据呢?
NoSQL 数据库中的解决方案几乎总是相同的:针对您拥有的用例修改数据模型。因此,在上述用例中,从每个文档中获取实际使用的数据,并将该数据存储在一个新文档中,或存储在包含少量文档的新集合中。然后加载该新文档或新集合,而不是读取 556 个单独的文档。
这意味着您可能需要将相同的数据写入数据库中的多个位置,这将使您的写入操作变得复杂,并且违背您在使用关系数据库时可能知道的最佳实践。但在处理NoSQL数据库时,这些做法实际上是完全正常的。在 NoSQL 中,我们常常最终使写入操作变得复杂,以获得更快、更简单、更具可扩展性的读取操作。
要了解更多相关信息,我建议阅读 NoSQL 数据建模 并观看 了解 Cloud Firestore。