AngularFire2将数据分组到Firestore集合的对象数组中

时间:2018-03-13 05:32:47

标签: firebase rxjs google-cloud-firestore angularfire2

我有一个名为addons的集合。该集合包含字段namedescpricetype

我立即通过this.afs.collection<AddOns>('addons');获取数据,返回AngularFirestoreCollection<AddOns>。我在Firestore Collection中为data定义了以下类文件。

AddOns.ts

export class AddOns{
    name?: string;
    desc?: string;
    price?: number;
    type?: string;
}

export class AddOnId extends AddOns{
    aid?: string;
}

由于我从该集合中也需要元数据,因此我创建了AddOnId类,扩展了AddOns类。要获取所有数据,请按以下步骤操作:

addOnsList: Observable<AddOnId[]>;

this.addOnsList = this.afs.collection<AddOns>('addons').snapshotChanges().map( x => {
  return x.map(data => {
    const addon = data.payload.doc.data() as AddOns;
    const aid = data.payload.doc.id;
    return {aid, ... addon}
  });
})

This post 提到了无法使用groupby的问题,因为将返回的数据为Observable of Array,并且还有答案如何转换Observable of array 1}} Observable of values使用flatMap

然后我尝试了

const grouped = this.afs.collection<AddOns>('addons').snapshotChanges()
                    .flatMap( arr => Observable.from(arr))
                    .groupBy(d => d.payload.doc.data().type);

但即使这样也不会产生预期的结果。我怎么能做到这一点?我应该如何根据类型对数据进行分组并将其转换为值的Observable?

1 个答案:

答案 0 :(得分:0)

在Observable映射中进行分组,例如return x.map { ... }.groupBy { ... }因为您打算转换数据,而不是Observable本身。 lodash对于数组有很好的groupBy实现。