【问题标题】:Reading Multiple Firebase Documents One By One一个接一个读取多个 Firebase 文档
【发布时间】:2020-09-17 03:17:10
【问题描述】:

因此,在我的 Web 应用程序中,我从 firebase 获取数据,到它准备好时它将拥有大约 5000 个文档。因此,为了减少读取次数,我在 firebase 中保留了一个数组,其中包含每个文档的 id 列表,我读取了该数组,然后与我在本地保存的列表进行比较。如果缺少 id,我会从 firebase 读取该特定文档(Firebase 网站的速度肯定会减慢,因为到目前为止有一个包含 3000 个文档的数组)。

但是,考虑一下我有 2000 多个文档丢失的情况,我必须根据我通过比较 firebase 和本地数组创建的 missingList 一个一个地获取它们。实在是太慢了,因为我正在使用等待,所以获取甚至一百个文档都需要很长时间。如果我不这样做,那么 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
}

【问题讨论】:

  • 您预计会有多少用户同时使用该应用?
  • @ThienLD 目前只有一个,它是为一位用户量身定做的。
  • 好的,那我想我有办法了

标签: javascript firebase google-cloud-firestore


【解决方案1】:

与 Firestore 中的“批量读取”最接近的是事务,但使用事务来读取数百个文档并不是很有效。相反,我建议您在每个文档中添加一个字段,例如 token。然后,每次第一次获取数据时,在客户端生成一个随机令牌,然后将其写入您阅读的每个文档。之后,如果您在上面提到的 id 列表中检测到更改,请对该 token 字段运行查询,例如:

db.collection('myCollection').where('token', '!=', locallySavedToken).get()

记得将你的本地令牌写回读取的文档。这样,您的查询时间会快得多。不利的一面是,每个读取的文档都需要 1 个额外的写入请求。如果您需要大量重新读取数据,则可以查看事务,因为写入请求的定价比读取请求更昂贵

【讨论】:

  • 您每天获得 20k 次免费写入请求,因此除非您需要更多,否则您不需要事务
  • 哇,这将比我目前编码的更好。我将使用该令牌方法。我目前不必担心超过 20000 写入限制,我很确定我不会超过它。谢谢!
  • @RohitV 很高兴我能帮上忙
  • 读取数等于满足条件的文档数对吧?
  • 是的,例如,如果您获得 10 个文档,则计为 10 次读取
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-06-16
  • 1970-01-01
相关资源
最近更新 更多