在返回的查询中使用子集合

时间:2019-04-23 11:34:52

标签: reactjs firebase google-cloud-firestore

查询文档后,我想知道是否可以引用子集合?我知道.get()返回一个promise,我们在上面写一个函数来获取文档。但是是否可以使用查询的文档来访问该子集合,而不必获取文档的ID并在.doc()中使用它?

1 个答案:

答案 0 :(得分:1)

否,这不可能不发出新查询。没有方法允许DocumentSnapshot使用该方法。

为了说明这一点,让我们假设您通过查询获得了一个城市文件(您知道该文件仅返回一个文档):

var citiesRef = db.collection("cities");
citiesRef.where("name", "==", "Brussels").get()
  .then(function(querySnapshot) {
      if (!querySnapshot.empty) {
          var doc = querySnapshot.docs[0];
          console.log("Document data:", doc.data());
      } else {
          // doc.data() will be undefined in this case
          console.log("No such document!");
      }
  }).catch(function(error) {
      console.log("Error getting document:", error);
  });

,您知道此文档为该城市的餐厅提供了一个子集合。如果要获取此收藏集,则需要执行以下操作:

var citiesRef = db.collection("cities");
citiesRef.where("name", "==", "Brussels").get()
  .then(function(querySnapshot) {
      if (!querySnapshot.empty) {
          var doc = querySnapshot.docs[0];
          var restaurantsCollRef = citiesRef.doc(doc.id).collection("restaurants");
          return restaurantsCollRef.get();    
      } else {
          throw new Error("No such document!");
      }
  })
  .then(function(querySnapshot) {
      querySnapshot.forEach(function(doc) {
         console.log(doc.id, " => ", doc.data());
      })
  }).catch(function(error) {
      console.log("Error getting document:", error);
  });

需要注意的一点是,实际上,从技术的角度来看,文档及其子集合不是相互关联的。

让我们举个例子:想象一个doc1集合下的col1文档

col1/doc1/

subDoc1(子)集合下的另一个subCol1

col1/doc1/subCol1/subDoc1

实际上,他们只是分享自己的道路的一部分而已。这样做的副作用是,如果删除文档,则其子集合仍然存在。