Firebase Firestore 如何对subcollection使用.where()按指定email查询数据
Firestore 子集合条件查询实现方案
你原本的查询写法不符合Firestore的API规则:collection() 方法仅支持在 Firebase 根实例、或者文档引用对象上调用,不能直接在集合引用后链式调用第二个collection(),所以无法直接通过collection('users').collection('account')的方式获取子集合引用。
根据你的使用场景,可选择以下两种实现方案:
场景1:已知users集合中对应用户的文档ID
如果你已经提前获取了要查询的用户在users集合下的文档ID(比如用户登录后的uid),可以直接定位到对应文档后再调用子集合查询:
// 把<用户文档ID>替换为实际的users集合下的文档ID firestore().collection('users').doc('<用户文档ID>').collection('account').where('email', '==', 'example@gmail.com').get()
该查询只会返回指定用户下account子集合中匹配email的文档。
场景2:未知用户文档ID,需要查询所有用户下的account子集合
如果你需要全局筛选所有用户的account子集合中匹配email的文档,需要使用Firestore的集合组查询功能:
- 先在Firebase控制台的索引管理页面,为
account集合组的email字段创建单字段索引,也可以先执行一次查询,根据控制台返回的报错提示一键创建对应索引 - 使用以下代码执行查询:
firestore().collectionGroup('account').where('email', '==', 'example@gmail.com').get()
集合组查询注意事项
- 集合组查询会匹配项目中所有命名为
account的集合,如果你项目中其他父路径下也存在同名的account集合,建议修改子集合命名避免查询结果冲突 - 查询返回的
account文档可以通过doc.ref.parent.parent获取对应的上级用户文档引用,进一步拉取用户的完整数据,示例如下:
firestore().collectionGroup('account').where('email', '==', 'example@gmail.com').get() .then(snapshot => { if (snapshot.empty) return console.log('无匹配数据') snapshot.forEach(accountDoc => { // 获取account文档数据 const accountInfo = accountDoc.data() // 获取对应用户文档引用并拉取用户数据 accountDoc.ref.parent.parent.get().then(userDoc => { const userInfo = userDoc.data() // 处理业务逻辑 }) }) })
内容的提问来源于stack exchange,提问作者KAYZORK
相关产品推荐
相关产品推荐

