使用Firebase将子集合查询到文档中

时间:2019-11-14 13:13:55

标签: angular typescript firebase google-cloud-firestore

我有一个angular 8打字稿接口设置,其中包括另一个接口的数组作为变量。如下所示:

export interface User {
    name: string;
    id: string;
    history: Job[];  //this is what is not getting generated
}

,作业界面如下所示:

export interface JobJson {
    id: string;
    price: number,
    notes: string
}

我正在使用Firebase的Cloud Firestore作为数据库,数据库结构如下所示:

  

用户//集合

     
    

|-> user1234 //文档

         
      

|->作业//子集合

             
        

|-> job1234 //子文档

      
    
  

当我从Firebase查询用户时:

this.firestore.collection<UserJson>('users').doc<UserJson>(id).valueChanges().subscribe((u) => {
    // do whatever with u
  });

它没有按预期填写历史记录:Jobs []。但是,在我的程序中,我需要将user.history数组设置为firebase中user下的子集合。如何做到这一点?感谢您的帮助!

1 个答案:

答案 0 :(得分:0)

据我所知,仅通过一次调用firestore便无法实现这一点。如果您知道哪个集合,则最接近的是两次调用的解决方法;如果您不知道集合的名称,则为最接近的两次。

here也是文档,documentReference的任何方法都无法获取文档快照和集合。

在我的案例中,我将添加两种解决方法,这些代码只是在控制台中打印内容。

不知道子集合名称:,它将获取所有子集合及其元素:

db.collection('users').doc(str[6]).get().then(documentSnapshot => {
  console.log(documentSnapshot.data());
});

db.collection(COLLECTION_ID).doc(DOCUMENT_ID).listCollections().then(collections => {
  for (let collection of collections) {
    console.log(`Found subcollection with id: ${collection.id}`);
    collection.get().then((snapshot) => {
      snapshot.forEach((doc) => {
        console.log(doc.id, '=>', doc.data());
      });
    })
    .catch((err) => {
      console.log('Error getting documents', err);
    });
  }
});

知道要获取的子集合:

db.collection(COLLECTION_ID).doc(DOCUMENT_ID).get().then(documentSnapshot => {
  console.log(documentSnapshot.data());
});

db.collection(COLLECTION_ID).doc(DOCUMENT_ID).collection(SUBCOLLECTION_ID).get()
  .then((snapshot) => {
    snapshot.forEach((doc) => {
      console.log(doc.id, '=>', doc.data());
      console.log(doc.id, '=>', JSON.stringify(doc));
    });
  })