检索云firestore中的子集合

时间:2018-01-28 23:24:14

标签: typescript firebase angularfire2 google-cloud-firestore

让我们像这样定义商业模式

export inteface Item {
    id: string;
    name: string;
}

export interface Container {
    id: string;
    items: Item[];
}

在Cloud Firestore中,我们有集合/containers 每个容器都包含带有文档的集合/items。 每个文档都有字段name。 因此,Cloud Firestore内部的结构会复制我们的商业模式。

现在我想要检索具有其项目集合的特定容器。

getContainer(idIn: string) {
  const document: AngularFirestoreDocument<Container> = this.afs.doc('containers/' + idIn);
  const document$: Observable<Container> = document.snapshotChanges().map(a => {
      const data = a.payload.data() as Container;
      const id = a.payload.id;
      return this.getItems(idIn).map( item => {
        return {id, ...data, items: item};
      });
    });
  return document$;
}

getItems(id: string) {
  const collection: AngularFirestoreCollection<Item> = this.afs.collection('containers/' + id + '/items');

  return collection.snapshotChanges().map(actions => {
    return actions.map(a => {
      const data = a.payload.doc.data() as Item;
      const id = a.payload.doc.id;
      return {id, ...data};
    });
  });
}

但是我一直收到关于返回Observable时缺少id的错误。 使用typescript 2.6.2进行编译。

error TS2322: Type 'Observable<Observable<{ items: { 'id': string;  'item': string; }[]; 'id': string...' is not assignable to type  'Observable<Container>'.
 Type 'Observable<{ items: { 'id': string; 'item': string; }[]; 'id': string...' is not assignable to type 'Container'.
 Property ''id'' is missing in type 'Observable<{ items: { 'id': string; 'item': string; }[]; 'id': string...'.

有谁可以指出我做错了什么?

2 个答案:

答案 0 :(得分:1)

在我看来,您的返回数据与接口模态不同。您只在界面中指定了iditems字段,因此它将是

  const data = a.payload.data() as Container;
  const id = a.payload.id;
  let items=[];
  this.getItems(idIn).valueChanges().subscribe(res=>{
      res.forEach(item=>{
        items.push(item);
      })
    });
  return {id:id, items: items};

答案 1 :(得分:0)

我正在阅读Firestore中的嵌套集合,以在我的情况下填充Expansion小部件。在https://stackoverflow.com/a/51057195/5013735

中查看我的解决方案

诀窍在于创建一个像这样的结构:

  List<Widget> _getChildren() {
    List<Widget> children = [];
    documents.forEach((doc) {
      children.add(
        ProjectsExpansionTile(
          name: doc['name'],
          projectKey: doc.documentID,
          firestore: firestore,
        ),
      );
    });
    return children;
  }