如何构造部分文档无权限时不报错的Firebase Firestore where查询
问题解答
首先明确:Firestore 的查询安全规则是全有或全无的设计,你使用 in 条件批量查询文档时,只要查询范围内存在任意一个你无权限访问的文档,整个查询会直接抛出权限错误,不会返回部分有权限的文档结果,这是 Firestore 安全规则的默认机制,无法通过调整查询参数改变。
可行解决方案
方案1:拆分批量查询为单文档独立请求
将原来的批量 in 查询拆成多个单文档 get 请求,配合 Promise.allSettled 处理结果,就能过滤出有权限访问的文档,不会因为单个无权限文档导致整体失败。
示例代码如下:
const articleRefs = articleIds.map(id => firebase.firestore().collection("articles").doc(id) ); // 等待所有请求完成,无论成功/失败 Promise.allSettled(articleRefs.map(ref => ref.get())) .then(results => { const validData = results // 仅保留请求成功的结果 .filter(res => res.status === 'fulfilled') .map(res => res.value) // 过滤掉不存在的文档 .filter(doc => doc.exists) .map(doc => doc.data()); console.log(validData); })
这个方案的注意点:
- 计费规则和批量查询一致:仅成功读取到的文档会计入读取次数,无权限/不存在的文档不会收费
- 客户端会自动对同批次请求做管线化处理,性能损耗远低于直觉上的多次请求开销
方案2:预处理articleIds过滤无权限ID
如果你的业务逻辑支持提前获取当前账号有权限的文章ID列表,可以先对 articleIds 做一次过滤清洗,再用 in 条件批量查询,这种方案的请求性能最优,开销最小。
两种方案可以根据你的业务场景选择使用。
内容的提问来源于stack exchange,提问作者darthzeran
相关产品推荐
相关产品推荐

