gpt4 book ai didi

firebase - 超过 firebase firestore 中的读取配额

转载 作者:行者123 更新时间:2023-12-02 20:02:53 30 4
gpt4 key购买 nike

我试图找出是否有合理的方法来做到这一点:

我的问题:

很快就超出了我在 firestore 中的每日读取配额。

我的数据库和我所做的事情:

我的数据库如下所示(简化):

sessions: {                 // collection
sessionId: { // document
users: { // collection
userId: { // document
id: string
items: { // collection
itemId: trackObject
}
}
}
}
}

现在我想从一个 session 中检索所有用户及其项目。大多数 session 有 2-3 个用户,但有些用户有大约 3000 个项目。我基本上想检索这样的数组:

[
{
userId,
items: [
...items
],
},
...users
]

我目前的做法:

所以我得到了所有用户:

const usersRef = db.collection(`sessions/${sessionId}/users`);
const userSnapshots = await usersRef.get();
const userDocs = userSnapshots.docs;

然后对于每个用户,我检索他们的项目:
(我使用了一个 for 循环,无论如何都可以讨论)

const user = userDocs[i].data();
const itemsRef = usersRef.collection(`${user.id}/items`);
const itemSnapshots = await itemRef.get();
const items = itemSnapshots.docs

最后我通过 map 检索实际的项目:

user.items = items.map(doc => doc.data());
return user;

我的理论:

因此,如果我在用户拥有 3000 个项目的 session 上执行此操作,代码将在 firestore 上执行 3000 次读取操作。仅运行 17 次后,我每天就消耗掉 50000 次操作。

这个推理有点基于this answer .

我的问题:

还有其他方法可以做到这一点吗?就像在一次读取调用中获取所有轨道一样?我是否应该看看是否可以将所有项目放入用户对象的数组键中,而不是存储为集合?难道 Firestore 的免费版本根本就不是为一次性检索这么多文档而设计的吗?

最佳答案

如果您尝试减少文档读取次数,则需要减少实现用例所需读取的文档数量。

例如,您的应用程序的用户想要阅读所有 3000 个项目的详细信息是完全不同的。因此,您可能希望限制最初阅读的项目数量,并仅根据需要加载其他项目。

还要考虑每个项目是否需要有自己的文档,或者是否可以将用户的所有项目合并到一个文档中。例如,如果您从不查询单个项目,则无需将它们存储为单独的文档。

如果您是否可以将常见项目合并到单个文档中,则需要考虑另一件事。例如,即使您将项目保留在单独的子集合中,也要在用户文档中保留用户最近 30 个项目的名称和 ID。这使您可以轻松地显示用户及其最近的 30 个项目。这样做实际上是预呈现每个用户的这 30 个项目,从而显着减少您需要阅读的文档数量。

要了解有关数据建模注意事项的更多信息,请参阅:

关于firebase - 超过 firebase firestore 中的读取配额,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55441103/

30 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com