Firebase/AngularFire5:如何查询未设置stuffCategory属性的集合项?
解决方案:用AngularFire查询Firebase中未设置
stuffCategory的项 当然可以实现!不过得先理清两个容易混淆的场景——Firebase里“字段存在但值为null”和“字段完全没设置(从未添加过)”是两种不同的情况,对应的查询方式略有区别,我帮你拆解下:
场景1:查询stuffCategory存在且值为null的项
你的原有代码思路是完全正确的!Firebase Realtime Database支持直接用equalTo: null来匹配值为null的子节点,不过有个关键前提:必须给stuffCategory字段添加索引,否则大数据量下会触发性能警告甚至查询失败。
可用代码
this.angularFire.database .list(`accounts/${this.stuffKey}/stuff`, { query: { orderByChild: "stuffCategory", equalTo: null } }) .subscribe( (stuff: any[]) => { console.log("找到stuffCategory为null的项:", stuff); }, (err) => { console.log("查询出错:", err); } );
必须添加的数据库索引
登录Firebase控制台,找到数据库规则,给目标路径添加.indexOn规则:
{ "rules": { "accounts": { "$stuffKey": { "stuff": { ".indexOn": "stuffCategory" } } } } }
场景2:查询完全没有设置stuffCategory的项
这才是你说的“从未设置值”的情况,Firebase本身不支持直接查询“不存在某个字段”的节点,但我们可以利用它的排序特性来实现:当按某个子节点排序时,没有该子节点的项会排在所有有该子节点的项最前面,且它们的排序权重小于任何非null的值。
我们可以先查询所有排序在null之前的项,再通过客户端过滤精确筛选出完全没有stuffCategory的项:
可用代码
this.angularFire.database .list(`accounts/${this.stuffKey}/stuff`, { query: { orderByChild: "stuffCategory", endAt: null } }) .subscribe( (allMatchingItems: any[]) => { // 过滤掉存在stuffCategory字段(哪怕值为null)的项 const neverSetCategory = allMatchingItems.filter(item => !('stuffCategory' in item)); console.log("从未设置stuffCategory的项:", neverSetCategory); }, (err) => { console.log("查询出错:", err); } );
补充说明
如果你的需求是同时包含“字段为null”和“字段未设置”的所有项,那直接用endAt: null的查询结果即可,不需要客户端过滤——它会返回这两类节点。
内容的提问来源于stack exchange,提问作者fitzmode
相关产品推荐
相关产品推荐

