如何递归地获取所有子集合的集合?

时间:2019-06-18 10:04:15

标签: javascript firebase vue.js google-cloud-firestore

我在Firestore中有一个名为“步骤”的集合,而在步骤集合内部,我在每个步骤文档中都有很多文档和称为“子步骤”的子集合。我需要创建一个数组,其中将包含所有可以使用此component的步骤和子步骤,因此该数组应如下所示:

let steps = [
  {
    step: 1,
    id: '1'
    substeps: [
      {
        step: '1.1'
        substeps: [
          {
            step: '1.1.2'
          }
        ]
      }
    ]
  }
]

现在,我想使用递归函数创建所有子步骤(如果存在)

我试图创建应该获取所有子集合的函数,但是我不知道如何完成它,所以下面是我尝试过的示例,但请注意函数未完成,这只是第一步 这是documentation

fetchAllStepsDeep (request) {
    //this.steps = array of objects with step data
    let result = []
    let requestLocal = this.$firebaseFirestore.collection('steps_for_classes')

    for (let i in this.steps) {
        result.push(this.steps[i])
        requestLocal.doc(this.steps[i].id).get().then((doc) => {
            if (doc.exists) {
                console.log('Document data:', doc.data())
            } else {
                // doc.data() will be undefined in this case
                console.log('No such document!')
            }
        }).catch((error) => {
            console.log('Error getting document:', error)
        })
    }
}

有人可以帮助我检索集合中的所有子集合,并与其他子对象数组一起创建一个大数组吗?我使用vue框架,所以也许这会有所帮助

谢谢

1 个答案:

答案 0 :(得分:1)

如果子集合始终被称为substeps,则可以创建一个帮助函数来处理递归

function getSubstepsOf(docRef, path, result) {
  docRef.collection("substeps").get((querySnapshot) => {
    querySnapshot.forEach((doc) => {
      result.push({ path, doc });
      getSubstepsOf(doc.ref, `${path}/substeps/${doc.id}`, result);
    });
  });
}

然后从您现有的代码中调用它:

getSubstepsOf(doc.ref, doc.id, result);