因此,在我的Web应用程序中,我正在从firebase中获取数据,到准备就绪时,它将有大约5000个文档。因此,为了减少读取次数,我在Firebase中保留了一个数组,其中包含每个文档的ID列表,我读取了这些ID,然后将其与本地保存的列表进行比较。如果缺少ID,我会从firebase中读取该特定文档(到目前为止,Firebase网站上的数组中包含3000个文档的速度肯定很慢)。
但是,请考虑以下情况:我丢失了2000多个文档,并且必须根据通过比较Firebase和本地数组创建的missingList
来逐个获取它们。实在太慢了,因为我正在使用await,所以获取甚至一百个文档都花了很长时间。如果我不这样做,则Firebase的请求将过载,并且由于某种原因,它会显示警告,指示我的网络已断开连接。
获取具有数组中给定ID的文档且无损失且足够快的最佳方法是什么?我可以像批处理写入,更新和设置一样对批处理文档进行批处理吗?
说Firebase有[1234, 1235, 1236, 1237]
,而我只有[1234]
,所以我需要从中读取[1235, 1236, 1237]
。
我正在使用for循环遍历每个id并像这样获取相应的文档
for (let i = 0; i < missingList.length; i++) {
var item = await db.collection('myCollection').doc(missingList[i]).get().then((snapshot) => snapshot.data())
await saveToDB(item) //I use PouchDB for local storage
}
答案 0 :(得分:1)
与Firestore中的“分批读取”最接近的是事务,但是使用转换读取数百个文档并不是很有效。相反,我建议您在每个文档中添加一个字段,例如token
。然后,每次第一次获得数据时,都会生成一个随机令牌客户端,然后将其写入您阅读的每个文档中。之后,如果您检测到上述ID列表中的更改,请在该token
字段上运行查询,例如:
db.collection('myCollection').where('token', '!=', locallySavedToken).get()
请记住将您的本地令牌写回到读取的文档中。这样,您的查询时间将更快。不利的一面是,每个读取的文档都需要1个额外的写入请求。如果您需要大量重新读取数据,则可以考虑进行事务处理,因为写入请求的价格比读取请求的价格昂贵