Использование вложенной коллекции из возвращаемого запроса

#reactjs #firebase #google-cloud-firestore

#reactjs #firebase #google-облако-firestore

Вопрос:

Я хотел знать, возможно ли ссылаться на вложенную коллекцию после запроса документа? Я понимаю, что .get() возвращает обещание, и мы пишем на нем функцию для получения документа. Но возможно ли использовать запрошенный документ для доступа к этой вложенной коллекции без необходимости получать идентификатор документа и использовать его внутри .doc()?

Ответ №1:

Нет, это невозможно без выдачи нового запроса. Не существует метода, который допускает это для DocumentSnapshot .

Чтобы проиллюстрировать это, давайте представим, что вы получаете документ city с помощью запроса (который, как вы знаете, возвращает только один документ):

 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
  

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

Комментарии:

1. Это место в ответе Рено. Да, я понял, что если вы удалите документ, вложенная коллекция все еще существует. На самом деле это странно. Также, когда я попробовал аналогично в консоли, остальные поля были видны, но не было упоминания о вложенной коллекции. Я действительно работал над этим. Ваше объяснение кажется более интуитивным. Через некоторое время я опубликую изображение моей модели данных и объясню, что я пытался сделать в частности. Мой код действительно работал, но я ищу какой-нибудь более простой обходной путь. Также даст вашему ответу шанс. Огромное спасибо.