如何使用AngularFire从Firebase Realtime Database列表查询部分属性而非全部
解决方案
首先明确:Firebase Realtime Database 暂不支持服务端的字段投影查询,也就是说你没办法直接在查询阶段指定只返回age字段,每次请求userList路径都会拉取该节点下的所有字段内容。你可以通过两种方式实现需求:
方式1:查询后本地过滤字段
这是最常用的轻量实现方案,适合查询频率不高、userList节点字段不多的场景,Angular Fire 实现代码如下:
首先确保你已经正确导入 Angular Fire 的 Realtime Database 模块:
// app.module.ts 相关导入 import { AngularFireDatabaseModule } from '@angular/fire/database'; @NgModule({ imports: [ // 其他导入 AngularFireDatabaseModule ] })
业务代码中查询并过滤字段:
import { AngularFireDatabase } from '@angular/fire/database'; import { map } from 'rxjs/operators'; @Component({ // 组件配置 }) export class YourComponent { constructor(private db: AngularFireDatabase) {} getUserAges() { return this.db.list('userList') .valueChanges() .pipe( map(users => users.map(user => ({ age: user.age }))) // 如果需要保留用户key的话可以用snapshotChanges // 示例: // map(snapshots => snapshots.map(snap => ({ // userId: snap.key, // age: snap.payload.val().age // }))) ) .subscribe(ages => { // 这里拿到的就是仅包含age字段的数组 console.log(ages); }); } }
方式2:优化数据结构(推荐高频查询场景)
如果你的业务经常需要单独查询用户年龄,建议按照 Firebase 数据扁平化的设计原则,单独新增一个userAges节点存储所有用户的年龄,节点结构如下:
userAges: { user1: 20, user2: 40, user3: 30 }
这时候你直接查询userAges路径即可,不需要过滤冗余字段,也能减少带宽消耗:
getUserAges() { return this.db.list('userAges') .valueChanges() .subscribe(ages => { console.log(ages); // 直接返回所有年龄的数组 }) }
内容的提问来源于stack exchange,提问作者Praveen Bhusal
相关产品推荐
相关产品推荐

