Firestore字段存在性查询及用户目标分类查询的正确实现
解决Firebase Cloud Firestore中字段存在/不存在的查询问题
嘿,我懂你现在的困扰——用空字符串当临时方案确实不够优雅,咱们直接用Firestore原生的查询逻辑来搞定它!
通用查询逻辑:判断字段存在或不存在
Firestore本身就支持直接判断字段是否存在的查询,核心是利用null的匹配规则:
- 查询存在指定字段的文档:使用
where('字段名', '!=', null)。只要字段存在,不管它的值是空字符串、数字还是其他类型,都不会等于null,这个条件就能精准命中。 - 查询不存在指定字段的文档:使用
where('字段名', '==', null)。只有当文档完全没有这个字段时,该条件才会匹配(注:如果字段存在但值本身是null,也会被匹配到,但你的场景里自定义目标根本没有master_id字段,所以完全适用)。
针对你的user_goals集合的具体实现
下面是两个贴合你需求的JavaScript函数,分别获取预定义目标和自定义目标:
1. 获取所有预定义目标(带有master_id字段且值为"XXXX")
根据你的描述,预定义目标是带有master_id字段且值固定为"XXXX"的文档,直接精准匹配即可:
async function getPredefinedGoals() { try { const querySnapshot = await db.collection('user_goals') .where('master_id', '==', 'XXXX') // 匹配master_id值为"XXXX"的预定义目标 .get(); const predefinedGoals = []; querySnapshot.forEach(doc => { predefinedGoals.push({ id: doc.id, ...doc.data() }); }); return predefinedGoals; } catch (error) { console.error('获取预定义目标失败:', error); throw error; } }
2. 获取所有自定义目标(无master_id字段)
这里就用到上面说的字段不存在的查询规则:
async function getCustomGoals() { try { const querySnapshot = await db.collection('user_goals') .where('master_id', '==', null) // 匹配完全没有master_id字段的文档 .get(); const customGoals = []; querySnapshot.forEach(doc => { customGoals.push({ id: doc.id, ...doc.data() }); }); return customGoals; } catch (error) { console.error('获取自定义目标失败:', error); throw error; } }
额外补充(特殊场景处理)
如果之后遇到需要严格区分“字段不存在”和“字段值为null”的场景,可以在客户端结合对象属性检查做二次过滤:
// 严格过滤出完全没有master_id字段的文档(排除字段存在但值为null的情况) querySnapshot.forEach(doc => { const data = doc.data(); if (!('master_id' in data)) { customGoals.push({ id: doc.id, ...data }); } });
内容的提问来源于stack exchange,提问作者Ram Babu
相关产品推荐
相关产品推荐

