Как рекурсивно получить коллекцию со всеми вложенными коллекциями? - PullRequest
1 голос
/ 18 июня 2019

У меня есть коллекция в firestore, называемая «шаги», и внутри коллекции шагов, у меня есть много документов и вложенных коллекций, называемых «подшагами» в каждом документе шагов. Мне нужно создать массив, в котором будут все шаги и подшагы, чтобы я мог использовать этот компонент , поэтому массив должен выглядеть следующим образом

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

Теперь я хочу создать рекурсивные функции, которые будут извлекать все подшаги, если они существуют

Я пытался создать функцию, которая должна извлекать все вложенные коллекции, но я не знаю, как ее завершить, поэтому ниже приведен пример того, что я пробовал, но обратите внимание, что функция не завершена, и это только первые шаги. Вот документация

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 Framework, так что, возможно, это может быть полезно

Спасибо

1 Ответ

1 голос
/ 18 июня 2019

Если подколлекция всегда называется 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);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...