Firestore能否同时使用文档ID和其他属性执行条件查询
Firestore 组合文档ID与其他属性查询的实现方案
可以实现该需求,但你提供的示例代码写法有误:调用doc()方法后返回的是文档引用实例,不支持链式调用where()查询方法,where()仅可作用于集合引用或查询实例,以下是两种正确的实现方式:
方案1:已知目标文档ID的最优写法
如果你已经明确要查询的文档ID,直接获取该文档后校验对应属性即可,无需走复合查询逻辑,性能更高且不需要额外创建索引:
const orgDoc = await firestore .collection('organizations') .doc(props.organizationId) .get() if (orgDoc.exists && orgDoc.data().members.includes(userId)) { // 文档存在且当前用户在成员列表内,执行对应逻辑 }
方案2:将文档ID作为查询条件之一的写法
如果你需要在集合级别的查询中同时匹配文档ID和其他字段,可以使用Firestore内置的documentId()特殊字段路径实现:
// Web SDK 9+ 导入写法,老版本SDK直接使用firestore.FieldPath.documentId()即可 import { FieldPath } from 'firebase/firestore' const querySnapshot = await firestore .collection('organizations') .where(FieldPath.documentId(), '==', props.organizationId) .where('members', 'array-contains', userId) .get() if (!querySnapshot.empty) { const targetOrg = querySnapshot.docs[0] // 拿到符合条件的文档,执行对应逻辑 }
注意事项
- 该方案需要提前创建对应的复合索引,首次执行查询如果缺少索引,Firestore会在报错信息中直接给出索引创建入口,点击创建等待数分钟即可正常使用。
- 因为文档ID在单集合内唯一,所以该查询返回的符合条件的结果最多只有1条。
内容的提问来源于stack exchange,提问作者Rodrigo
相关产品推荐
相关产品推荐

