Firestore中schedule下嵌套ticket子集合的查询优化咨询
Firestore查询用户ticket性能优化方案
最优方案:使用集合组查询
Firestore原生支持集合组查询,可以直接查询所有名称为ticket的子集合,不需要遍历父级schedule文档,是当前场景下成本最低的优化方式。
操作步骤:
- 第一步:为
ticket集合的userId字段(你存储用户标识的字段)创建集合组索引可以直接在Firestore控制台手动创建,也可以第一次执行查询时报错后点击报错信息里的链接自动生成,索引创建完成后即可正常查询
- 第二步:直接执行集合组查询获取指定用户的所有ticket,查询代码示例(以Web SDK为例):
const userTickets = await db.collectionGroup('ticket').where('userId', '==', 当前用户ID).get(); - 第三步:如果需要关联获取ticket对应的schedule数据,只需要通过每个ticket文档的
ref.parent.parent即可直接获取对应schedule文档的引用,不需要额外做条件匹配查询。
方案优势:
- 不需要调整现有数据结构,也不需要新增冗余字段
- 仅需一次查询即可拿到指定用户的所有ticket数据,查询效率完全满足Firestore的性能规范
- 保留了原有
ticket嵌套在schedule下的结构,修改schedule配置的逻辑完全不需要调整
备选方案:冗余存储ticket的反向关联(适合有更复杂关联查询的场景)
如果后续还有其他跨schedule的ticket查询需求,可以新增一个根级ticket集合,在用户下单生成ticket时,同时写入两个位置:
- 原有路径
/schedule/{scheduleName}/ticket/{ticketId}保留,用于关联schedule配置修改的场景 - 根级路径
/ticket/{ticketId}写入相同的ticket数据,同时冗余存储对应的scheduleName字段
查询用户ticket时直接查根级ticket集合,需要修改schedule关联配置时直接修改schedule文档,原有嵌套路径下的ticket可以正常读取到最新的schedule关联数据。
内容的提问来源于stack exchange,提问作者Tony Hart
相关产品推荐
相关产品推荐

