我正在尝试找到一种在Firestore中读取大量数据的好方法。目前,我在一个“电影”集合中有10000个文档。这些文档是包含有关电影的字段(作者,标题,id)的记录。 我的客户使用一个查询以.limit(20)随机读取20个文档,并且用户可以根据自己想要获取新文档的次数触发该查询。问题是,用户可以要求提供1000个文档(电影),而这需要在Firestore中读取1000个文件。
我在想,是否有可能通过以不同的方式构建我的收藏夹(例如500个带有20个文档(电影)的子收藏夹)来减少阅读次数。像这样,我将文档平均分配,客户只能读取1个包含20个文档的子集合。这会将读取次数减少到1吗?
答案 0 :(得分:2)
减少读取次数的唯一方法是读取较少的文档。子集合也是如此。减少文档数量的一种方法是用更多数据填充单个文档...
// in a single doc
movies: {
movie_id_a: { title: 'Gone With the Wind', rating: 'G' },
movie_id_b: { title: 'Casablanca', rating: 'PG' },
...
}
但这是有代价的:您将遇到文档大小的限制,并且您将无法使用与将逻辑块分别保存在自己的文档中相关的数据库功能(例如仅保存对一部电影的引用) ,或仅听一部电影等)
答案 1 :(得分:0)
您是说:
我的客户可以使用.limit(20)随机读取20个文档,当用户单击按钮时,将再次读取20个新文档。问题在于,用户可以索要1000个文档,而在Firestore中读取该文件的成本为1000。
如果您希望限制用户一次最多读取20个文档,可以在服务器端安全规则中使用以下方法进行操作:
// Limit documents per request to 50
allow list: if request.query.limit <= 20
另请参见query object in security rules上的参考文档。
当然,这仅限制了用户一次可以请求的文档数量。他们仍然可以执行50个查询,每个查询20个文档,并以此方式获取1000个文档。