如何使用firestoreConnect查询Firebase中的嵌套文档集合
Firestore嵌套集合查询配置方案
react-redux-firebase的firestoreConnect支持两种常见的嵌套集合查询场景,配置方法如下:
场景1:已知上层父文档ID,查询该文档下的指定子集合
你只需要在配置项中按集合→文档→子集合的层级依次指定路径即可,示例代码:
export default compose( connect(mapStateToProps, mapDispatchToProps), firestoreConnect([ { collection: 'Seats1', doc: '父级文档ID', // 替换为你实际的上层文档ID // 配置子集合,多层嵌套可以继续在子集合下加doc和subcollections subcollections: [{ collection: '你要查询的子集合名称' }], // 可选:添加查询条件 where: ['status', '==', 'available'], // 可选:指定redux中存储的字段名,避免同名集合数据覆盖 storeAs: 'seats1SubData' }, // 其余Seats2~Seats5的嵌套查询按照上面的格式依次配置即可 ]) )(ReservDesk)
场景2:不知道父文档ID,查询所有/符合条件的父级文档下的同名子集合
这种情况使用集合组查询即可,注意使用前需要先在Firebase控制台为对应子集合创建查询索引:
export default compose( connect(mapStateToProps, mapDispatchToProps), firestoreConnect([ { // 用collectionGroup指定要跨父级查询的子集合名称 collectionGroup: '你要查询的子集合名称', where: ['isReserved', '==', false] } ]) )(ReservDesk)
数据获取与常见注意事项
在mapStateToProps中按照你配置的storeAs或者子集合名称取对应数据即可:
const mapStateToProps = (state) => { return { // 有序数组格式数据 seatSubList: state.firestore.ordered.seats1SubData, // 键值对格式数据 seatSubMap: state.firestore.data.seats1SubData } }
- 嵌套路径必须严格按照
集合→文档→集合→文档的结构配置,不能跳过文档直接配置两层集合 - 带
where/orderBy条件的查询、集合组查询都需要按照Firestore控制台的报错提示创建对应索引,否则查询会失败 - 不同父级下的子集合同名时必须配置
storeAs区分存储字段,避免数据相互覆盖 - 请确认Firebase安全规则已放开对应嵌套子集合的读权限,否则会返回403权限错误
内容的提问来源于stack exchange,提问作者Tamás Köböl
相关产品推荐
相关产品推荐

