Как получить доступ к вложенной коллекции запрашиваемого документа в Firestore? - PullRequest
0 голосов
/ 03 марта 2020

Контекст : Ниже приведен скриншот моей коллекции и документа в Firebase Firestore. По сути, каждый документ транзакции имеет свое собственное поле и коллекцию чатов внутри него.

Что мне нужно : Моя цель - запросить документ с указанным c handler_id и получить доступ коллекция чата внутри него.

Что происходит : этот запрос возвращает только поле транзакции

 db.collection("transaction").where("handler_id", "==", 3)

Как включить коллекцию чата в запрашиваемый документ? Есть ли у вас какие-либо предложения о том, как я могу более эффективно структурировать свои данные? enter image description here

1 Ответ

2 голосов
/ 03 марта 2020

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

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

Если мы предположим, что в коллекции transaction есть только один документ с handler_id = 3, вы бы сделали что-то вроде следующего:

db.collection("transaction").where("handler_id", "==", 3).get()
.then(querySnapshot => {
   return querySnapshot.docs[0].ref.collection('chat').get();
})
.then(querySnapshot => {
    querySnapshot.forEach(doc => {
        // doc.data() is never undefined for query doc snapshots
        console.log(doc.id, " => ", doc.data());
    });
});

Если вы хотите установить слушатель подколлекции chat должен просто вызвать метод onSnapshot() вместо get(), как показано ниже:

db.collection("transaction").where("handler_id", "==", 3).get()
.then(querySnapshot => {
   querySnapshot.docs[0].ref.collection('chat').onSnapshot(querySnapshot => {
        // Do whatever you want with the querySnapshot
        // E.g. querySnapshot.forEach(doc => {...})
        // or querySnapshot.docChanges().forEach(change => {...})
        // See https://firebase.google.com/docs/firestore/query-data/listen#listen_to_multiple_documents_in_a_collection
    });
}); 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...