Firebase查询收集和合并子收集数据

时间:2018-10-23 08:33:49

标签: firebase promise async-await google-cloud-firestore

我正在尝试找到一种方法来获取文档集合及其子集合数据。

例如,我的树是...

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

......,其中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 :(得分:2)

对于移动/网络客户端库,无法通过一个查询获取Firestore文档的数据及其子集合文档的数据。< / p>

甚至无法获取文档的子集合列表(使用移动/网络客户端库),请参见https://firebase.google.com/docs/firestore/query-data/get-data#list_subcollections_of_a_document

因此,您需要知道子集合的名称才能查询它们(这是您的情况(名称='historic')。

您可以执行以下操作。首先,获得所有父文档,同时使用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

答案 1 :(得分:0)

首先创建一个空数组,例如resultsArray = []。使用简单或复合查询来获取您要阅读的文档。然后遍历resultDocuments,创建一个resultObject记录所需的任何属性。在该迭代中,.push(resultObject)到结果数组。