【问题标题】:Reducing the amount of reads in a where query减少 where 查询中的读取量
【发布时间】:2022-06-10 22:42:29
【问题描述】:

我最近在我的项目中实现了 firebase,并且我创建了一个用户集合,这个集合为每个用户都有一个文档,每个文档有大约 8 个字段,当我的用户启动应用程序时,我试图拉取那个文档对应他的数据,所以我在做以下查询:

async function getUserData() {
        
        const _collection = collection(db, "users")
        const _query = query(_collection, where("userid", "==", uniqueUserID))
        const querySnapshot = await getDocs(_query)
        querySnapshot.forEach((doc) => {
            console.log(doc.data())
        })
        setLoadingStatus(false)
    }

此查询有效并为我提供了相应的用户数据,但问题是,如果用户在集合中的位置太远,这将对每个文档执行 8 次读取,直到它到达相应的用户,我试图实现一个使用lastModified 的缓存系统,但我仍然需要读取该字段的文档数据,并且最终将使用或多或少相同数量的读取。我的问题是:当我尝试比较文档中的值时,如何减少执行的读取操作的数量,我还想过添加一个a,就像a_uniqueUserID 这样它按字母顺序排序并占据第一个文件的位置,但它很hacky。 编辑:这是我的结构的样子:

【问题讨论】:

  • 我不清楚您为什么相信“这将执行每个文档 8 次读取”。您在此处的收藏似乎只有 5 个文档。即使您查询整个集合,也只需读取 5 次文档。我认为,如果您更清楚地说明您正在使用的特定源数据是什么以及您如何计算这些文档读取次数,这将有所帮助。
  • 我当天的所有读写都是0,我打开应用程序,应用程序得到了用户,在结构中是第三个文档并读取了他的用户ID,只要这是执行后,我刷新了 firebase 控制台,读取次数为 22,所以我的逻辑是每个文档有 8 个字段,它是第三个文档中的第 6 个字段,所以它读取第一个文档,8 个读取,第二个,8 个读取和第三个 6 读取,因为它得到了值。希望这更清楚
  • 如果您只想要一个用户的数据,为什么要获取所有文档?如果您将用户 ID 设置为与其身份验证 ID 相同,则可以仅使用 ID 获取单个文档。
  • 读取是每个文档,而不是每个字段。如果您阅读 5 份文档,则只有 5 次阅读。如果您在文档更改时触发了 Cloud Functions,这可能触发了您的额外读取。
  • @JasonBerryman 那么您的意思是使用用户的实际 ID 创建每个文档?这样我们只需要查询一个文档而不用遍历所有文档?

标签: firebase react-native google-cloud-firestore


【解决方案1】:

我认为您误解了文档和字段的定义。当您阅读文档时,您总是会从中获取所有字段。快照包含读取的所有内容,即使您不使用它。除了保存所有字段所需的存储空间外,每个字段没有额外费用。在您的屏幕截图中,您显示了 5 个文档,其中一个文档有 8 个字段。

您可能误解了控制台中的指标。当您使用控制台读取和写入文档时,这些也被计费为读取和写入 - 使用控制台不是“免费的”。您所看到的是您的应用正在执行的操作与您在控制台中执行的操作的组合。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-09
    • 2020-01-11
    • 1970-01-01
    • 1970-01-01
    • 2020-03-31
    • 2019-08-22
    • 1970-01-01
    相关资源
    最近更新 更多