Firestore无需编写特殊查询自动返回指定分类数据的实现方案
实现方案
不需要用到机器学习相关能力,依托Firebase原生生态工具就可以满足需求,以下是几种可行方案,按实现成本从低到高排序:
方案1:Firestore安全规则 + 客户端全局缓存配置
这个方案改动量最小,仅需要全局读取一次配置表即可复用,后续配置变更无需修改代码:
- 首先在安全规则中增加权限校验,避免用户查询到非允许分类的游戏数据(假设配置集合名为
GameConfig,唯一配置文档id为default,存储分类的字段为allowedCategory),规则示例如下:
rules_version = '2'; service cloud.firestore { match /databases/{database}/documents { match /Games/{gameId} { allow read: if resource.data.category == get(/databases/$(database)/documents/GameConfig/default).data.allowedCategory; } } }
- 客户端全局仅执行一次配置读取,将允许的分类值缓存下来,后续所有游戏查询复用该值即可,调整后的代码示例:
// 全局仅初始化执行一次,不需要每次查询都读配置表 const allowedCategory = await firestore().collection('GameConfig').doc('default').get().then(doc => doc.data().allowedCategory); // 后续游戏查询直接复用缓存值即可 firestore() .collection('Games') .where('category', '==', allowedCategory) .get() .then(snaps => console.log(snaps.docs))
方案2:Cloud Functions 封装查询接口
如果完全不想让客户端感知配置读取、查询过滤逻辑,可以用云函数封装整个查询流程:
- 编写可调用云函数,所有配置读取、数据过滤逻辑都在云端完成,示例代码如下:
const functions = require('firebase-functions'); const admin = require('firebase-admin'); admin.initializeApp(); exports.getAllowedGames = functions.https.onCall(async (data, context) => { // 云端主动读取配置,对客户端完全透明 const configSnap = await admin.firestore().collection('GameConfig').doc('default').get(); const allowedCategory = configSnap.data().allowedCategory; // 云端执行过滤查询 const gamesSnap = await admin.firestore().collection('Games').where('category', '==', allowedCategory).get(); // 格式化返回结果 return gamesSnap.docs.map(doc => ({id: doc.id, ...doc.data()})); });
- 客户端直接调用云函数即可,不需要做任何查询相关的逻辑调整,示例代码:
firebase.functions().httpsCallable('getAllowedGames')() .then(result => console.log(result.data))
方案3:Cloud Trigger 自动标记可见性
如果查询逻辑统一收口在后端,不想每次查询都读取配置表,可以通过触发器同步配置状态到游戏文档:
- 给
GameConfig配置表编写更新触发器,当配置的允许分类变更时,自动遍历所有游戏文档,给符合分类的文档新增/修改is_visible字段为true,不符合的修改为false - 后续查询时仅需要加
where('is_visible', '==', true)的条件即可,不需要每次读取配置表,配置变更也不需要修改查询逻辑 - 注意:该方案会产生额外的文档写入成本,适合游戏数据量不大、配置变更频率低的场景
内容的提问来源于stack exchange,提问作者Anuj Raghuvanshi
相关产品推荐
相关产品推荐

