如何从Firebase Realtime Database单次查询获取多个指定子节点数据
Firebase Realtime Database 批量拉取指定子节点方案
Firebase Realtime Database 暂不支持你提到的直接传入多个子节点键值、单次查询拉取所有目标数据的语法,你可以根据自己的业务场景选择以下两种优化方案:
方案1:全量拉取后过滤(适合段落总量较少的场景)
如果你的paragraphs节点下总数据量不大,可以直接一次性拉取整个节点的所有内容,再根据下标数组过滤出目标数据,仅产生1次网络请求:
const x = [0, 2, 5]; const allParaSnapshot = await get(child(dbRef, 'paragraphs')); let targetParas = []; if (allParaSnapshot.exists()) { const allParaData = allParaSnapshot.val(); targetParas = x.map(index => allParaData[index]); }
- 优势:实现简单,仅单次网络请求
- 劣势:如果段落总量极大,会拉取大量不需要的冗余数据,浪费带宽
方案2:并发批量请求(官方推荐,适合绝大多数场景)
虽然是发起多次get请求,但Firebase客户端底层会自动复用同一条WebSocket连接处理所有请求,实际网络开销和单次请求差异极小,同时不会拉取冗余数据,扩展性也极强:
const x = [0, 2, 5]; // 批量生成所有查询的Promise实例 const queryPromises = x.map(index => get(child(dbRef, `paragraphs/${index}`))); // 并发执行所有查询,等待全部返回 const paraSnapshots = await Promise.all(queryPromises); // 提取所有目标段落内容 const targetParas = paraSnapshots.map(snap => snap.exists() ? snap.val() : null);
这种写法不管你需要拉取多少个下标对应的段落,只需要修改x数组即可,完全不需要调整代码逻辑,也不会出现你之前逐一声明变量的扩展性问题。
如果你后续考虑切换到Cloud Firestore,它原生支持
in查询,可以单次批量拉取最多10个指定文档,但目前Realtime Database没有对应原生能力,上述两种方案就是当前的最优解。
内容的提问来源于stack exchange,提问作者Mir Adnan Siraj
相关产品推荐
相关产品推荐

