Сбор запросов и объединение данных подколлекции Firebase - PullRequest
0 голосов
/ 23 октября 2018

Я пытаюсь найти способ собрать коллекцию документов вместе с данными их подколлекций.

Например, мое дерево ...

-locations
 -{locationId}
   -historic
     -april
       -airTemp: 12.4
       -displayOrder: 4
     -august
       -airTemp: 14.5
       -displayOrder: 9
     -december
       -airTemp: 13.5
       -displayOrder: 12
     etc..

...where locationId - это документ, а historic - это подколлекция с ежемесячными документами.

Я знаю, как получить элементы коллекции верхнего уровня и сохранить их в массиве, но я хочу добавить их подколлекцию.данные (т.е. jan, feb и т. д.) в каждый документ.

  var locations = []

  let ref = db.collection('locations')
  db.collection('locations').get()
  .then(snapshot => {
      snapshot.forEach(doc => {
          let location = doc.data()
          location.id = doc.id
          location.name = doc.name

          // get the historic subcollection data here

      })
  })

Как получить объединенные данные (сбор и подколлекцию) из каждого объекта и затем поместить их в массив?

щедрость - неправильная структура каждый месяц должен быть своим собственным объектом

Ответы [ 2 ]

0 голосов
/ 28 октября 2018

Сначала создайте пустой массив, например, resultsArray = [].Используйте простые или составные запросы, чтобы получить документы, которые вы хотите прочитать.Затем итерируйте по resultDocuments, создавая resultObject запись любых свойств, которые вы хотите.Внутри этой итерации .push(resultObject) к массиву результатов.

0 голосов
/ 23 октября 2018

Невозможно с помощью библиотек мобильных / веб-клиентов получить в одном запросе данные документа Firestore и данные документов его подколлекций.

Нет даже способа получить список вложенных коллекций документа (с мобильными / веб-клиентскими библиотеками), см. https://firebase.google.com/docs/firestore/query-data/get-data#list_subcollections_of_a_document

Так что вам нужно знать имявложенные коллекции, чтобы запросить их, что является вашим случаем (name = 'исторический').

Вы можете сделать следующее.Сначала вы получаете все родительские документы и одновременно используете Promise.all() для параллельного запроса всех «исторических» вложенных коллекций.

    var db = firebase.firestore();

    var promises = []
    db.collection('locations').get()
        .then(snapshot => {
            snapshot.forEach(doc => {
                let location = doc.data()
                location.id = doc.id
                location.name = doc.data().name
                console.log(location);
                promises.push(doc.ref.collection('historic').get());
            })
            return Promise.all(promises);
        })
        .then(results => {
            results.forEach(querySnapshot => {
                querySnapshot.forEach(function (doc) {
                    console.log(doc.id, " => ", doc.data());
                });
            });
        });

Обратите внимание, что порядок resultsмассив точно такой же, как порядок массива promises.

Также обратите внимание, что для получения значения элемента документа (например, name) вам нужно сделать doc.data().name, а не doc.name.

...