Firebase Firestore中能否从Query对象获取已配置的查询参数信息?
Firebase 官方公开的 SDK 接口没有提供直接读取 Query 实例内部配置的方法,你可以通过以下两种方案实现需求:
- 方案一:封装查询构造逻辑(生产环境推荐)
你可以自行封装查询的构造过程,在调用查询方法的同时同步存储配置信息,需要时自行拼接成目标格式的字符串。以 Android 平台为例,封装示例如下:
public class QueryWrapper { private Query query; private List<String> conditions = new ArrayList<>(); private String collectionPath; public QueryWrapper(FirebaseFirestore db, String collectionPath) { this.collectionPath = collectionPath; this.query = db.collection(collectionPath); } public QueryWrapper whereEqualTo(String field, Object value) { query = query.whereEqualTo(field, value); conditions.add(String.format("%s EQUALSTO %s", field, value)); return this; } // 按相同规则封装orderBy、limit、whereGreaterThan等所有需要用到的查询方法 public String getInfo() { StringBuilder infoBuilder = new StringBuilder("FIREBASE QUERY ON /") .append(collectionPath) .append("/ "); if (!conditions.isEmpty()) { infoBuilder.append("WHERE ").append(String.join(" AND ", conditions)); } return infoBuilder.toString(); } public Query getOriginalQuery() { return query; } }
使用时替换原有查询构造逻辑即可:
// 原有逻辑 // CollectionReference citiesRef = db.collection("cities"); // Query query = citiesRef.whereEqualTo("state", "CA"); // 替换为封装后的逻辑 QueryWrapper citiesQueryWrapper = new QueryWrapper(db, "cities"); Query query = citiesQueryWrapper.whereEqualTo("state", "CA").getOriginalQuery(); // 调用自定义方法即可获取查询信息 String queryInfo = citiesQueryWrapper.getInfo(); // queryInfo输出为:FIREBASE QUERY ON /cities/ WHERE state EQUALSTO CA
- 方案二:反射读取SDK内部属性(仅适合调试场景使用)
各个平台的Firebase SDK内部实际上存储了完整的查询配置,你可以通过反射或者直接访问非公开属性读取相关信息,缺点是依赖SDK内部实现,版本更新后可能失效。以Web端JS SDK为例:
const query = db.collection("cities").where("state", "==", "CA"); // 读取内部配置 const collectionPath = query._query.path.segments.join("/"); const conditionList = query._query.filters.map(filter => { const field = filter.field.segments.join("."); const operator = filter.op.toUpperCase(); const value = filter.value; return `${field} ${operator} ${value}`; }); const queryInfo = `FIREBASE QUERY ON /${collectionPath}/ WHERE ${conditionList.join(" AND ")}`;
内容的提问来源于stack exchange,提问作者Matthew Swallow
相关产品推荐
相关产品推荐

