超过firebase firestore中的读取配额

超过firebase firestore中的读取配额,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,我想知道是否有一个合理的方法来做到这一点: 我的问题是: 很快就超过了我在firestore的每日阅读量 我的数据库和我的工作: 我的数据库如下所示(简化): 现在我想从一个会话中检索所有用户及其项目。大多数会话有2-3个用户,但有些用户有大约3000个项目。我基本上希望检索这样的数组: [ { userId, items: [ ...items ], }, ...users ] 我目前的做法: 因

我想知道是否有一个合理的方法来做到这一点:

我的问题是: 很快就超过了我在firestore的每日阅读量

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

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

[
    {
        userId,
        items: [
            ...items
        ],
    },
    ...users
]
我目前的做法: 因此,我得到了所有用户:

const usersRef = db.collection(`sessions/${sessionId}/users`);
const userSnapshots = await usersRef.get();
const userDocs = userSnapshots.docs;
然后为每个用户检索他们的项目:
(我使用for循环,但无论如何都可以讨论)

最后,我通过地图检索实际项目:

user.items = items.map(doc => doc.data());
return user;
我的理论是: 因此,如果我在一个用户有3000个项目的会话上执行此操作,代码将在firestore上执行3000个读取操作。仅仅跑了17次之后,我一天就完成了50000次手术

这一推理在某种程度上是基于

我的问题:
还有别的方法吗?比如在一次读取通话中获得所有曲目?我是否应该查看是否可以将所有项放入用户对象中的数组键中,而不是作为集合存储?firestore的免费版本不是专为一次性检索这么多文档而设计的吗?

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

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

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

另一件事是考虑是否可以将共同项目合并成单个文档。这方面的一个例子是,即使您将项目保留在单独的子集合中,也要在用户文档中为用户保留最近30个项目的名称和ID。这允许您轻松显示用户及其30个最新项目。这样做基本上就是预先呈现每个用户的30个项目,大大减少了需要阅读的文档数量

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

  • 视频系列,特别是
  • 这篇关于

感谢您给出精心设计的答案!
const user = userDocs[i].data();
const itemsRef = usersRef.collection(`${user.id}/items`);
const itemSnapshots = await itemRef.get();
const items = itemSnapshots.docs
user.items = items.map(doc => doc.data());
return user;