求可检测对象是否已定义的Firestore查询语句
解决Firestore检测对象字段是否存在的查询问题
嘿,我来帮你搞定这个Firestore查询的问题!你之前尝试的where("address", ">", "")之所以没效果,是因为address是对象类型的字段,不是字符串,Firestore没法用字符串的比较逻辑来判断对象是否存在。
要筛选出已经定义了address字段(不管里面的子字段是什么)的文档,这里有两种靠谱的方法:
方法1:用!= null判断字段存在(最通用)
这是兼容性最好的写法,不管你用的是哪个版本的Firestore SDK,都能生效:
// 传统命名空间SDK写法 db.collection("users").where("address", "!=", null).get() .then(querySnapshot => { querySnapshot.forEach(doc => { console.log(doc.data().name); // 会输出example2、example3 }); }); // Web v9+模块化SDK写法 import { collection, query, where, getDocs } from "firebase/firestore"; const q = query(collection(db, "users"), where("address", "!=", null)); const querySnapshot = await getDocs(q); querySnapshot.forEach(doc => { console.log(doc.data().name); });
这个查询会返回所有address字段存在且不为null的文档,完全匹配你想要的结果。
方法2:使用exists操作符(更直观)
如果你的SDK版本支持(比如Web v9+、最新的移动端SDK),可以用专门的exists操作符来明确判断字段是否存在:
// Web v9+模块化SDK示例 const q = query(collection(db, "users"), where("address", "exists", true)); const querySnapshot = await getDocs(q);
语义上更清晰,一看就知道是在检查字段是否存在。
为啥之前的写法不生效?
当你用where("address", ">", "")时,Firestore会尝试把address对象转换成字符串去做比较,这显然不符合逻辑,自然得不到正确结果。而!= null或exists是专门针对字段存在性的判断逻辑,能正确识别对象类型的字段。
测试一下上面的查询,就能得到你想要的example2和example3啦!
内容的提问来源于stack exchange,提问作者AlexZvl
相关产品推荐
相关产品推荐

