子集合的firestore查询错误:rest.collection不是函数

时间:2020-10-28 12:07:16

标签: javascript node.js firebase react-native google-cloud-firestore

我想计算所有餐厅的分支机构数量。 “分支”是“餐馆”的子集合。当我尝试执行此查询时,出现错误:

rest.collection不是函数

这是我的代码。我该如何解决?

async function getBranch(){ 
  const size = 0;
  const restRef = await firebase.firestore().collection('Restaurants').get();
  restRef.forEach((rest) => {
    const branchRef = rest.collection('Branch').get();
    size = size + branchRef.size();
  })
  return size;
}

2 个答案:

答案 0 :(得分:1)

您必须提供餐厅ID才能获得子集合。因此最好参考GROUP BY并获取所有Restaurants

branches

答案 1 :(得分:0)

您可以使用Promise.all()(未经测试)进行以下操作。

async function getBranch(){ 
  let size = 0;
  const restQS = await firebase.firestore().collection('Restaurants').get();

  const promises = [];
  restQS.forEach((rest) => {
     promises.push(rest.collection('Branch').get());
  });

  const querySnapshotsArray = await Promise.all(promises);

  querySnapshotsArray.forEach(qs => {
     size += qs.size;   // <= Note that size is a property of the QuerySnapshot, not  a method
  })
  
  return size;
}

另一种方法是,如果唯一名为Branch的集合是Restaurantss的子集合,则用Collection group query查询所有分支文档。

const branchQS = await firebase.firestore().collectionGroup('Branch').get();
return branchQS.size;

但是,

您应注意,这意味着每次要获取branch个文档的数量时,您都会读取所有(子)集合的所有文档,因此,成本。

因此,如果您的馆藏中有很多文档,一种更经济的方法是维护一组保存文档数量的分布式计数器。每次添加/删除文档时,都增加/减少计数器。

有关更多详细信息和此here,请参见文档中的answer