Javascript 如何在Firestore中访问查询文档的子集合?

Javascript 如何在Firestore中访问查询文档的子集合?,javascript,firebase,google-cloud-firestore,Javascript,Firebase,Google Cloud Firestore,上下文:下面是我在Firebase Firestore中的收藏和文档的屏幕截图。基本上,每个事务文档都有自己的字段和一个聊天集合 我需要什么:我的目标是使用特定的处理程序id查询文档,并访问其中的聊天集 发生了什么事:此查询仅返回事务字段 db.collection("transaction").where("handler_id", "==", 3) 如何在查询的文档中包含聊天室集合?您对如何更有效地构建数据结构有何建议? Firestore中的查询是浅显的,这意味着当您通过查询查询文档时

上下文:下面是我在Firebase Firestore中的收藏和文档的屏幕截图。基本上,每个事务文档都有自己的字段和一个聊天集合

我需要什么:我的目标是使用特定的处理程序id查询文档,并访问其中的聊天集

发生了什么事:此查询仅返回事务字段

 db.collection("transaction").where("handler_id", "==", 3)
如何在查询的文档中包含聊天室集合?您对如何更有效地构建数据结构有何建议?

Firestore中的查询是浅显的,这意味着当您通过查询查询文档时,您只会得到您正在查询的集合中的相应文档,而不会得到其子集合中的文档

因此,您需要首先查询父
事务
文档(这是一个异步过程),当您得到它时,查询子集合(这也是一个异步过程)

如果我们假设
事务
集合中只有一个
handler\u 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());
    });
});

如果要设置
聊天
子集合的侦听器,只需调用该方法,而不必调用该方法,如下所示:

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
    });
}); 

Firestore中的查询是浅层的,这意味着当您通过查询查询文档时,您只会得到您正在查询的集合中的相应文档,而不会得到其子集合中的文档

因此,您需要首先查询父
事务
文档(这是一个异步过程),当您得到它时,查询子集合(这也是一个异步过程)

如果我们假设
事务
集合中只有一个
handler\u 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());
    });
});

如果要设置
聊天
子集合的侦听器,只需调用该方法,而不必调用该方法,如下所示:

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
    });
}); 

好的,我理解在单个查询中不可能做到这一点,因为Firestore中的查询很浅。但是,是否可以在聊天集合中添加onSnapshot功能?子集合与查询和侦听器的顶级集合没有什么不同。只需构建对它的引用,并像其他引用一样使用该引用。@paulaysabellemedina正如Doug所解释的,您只需调用
chat
子集合上的
onSnapshot()
方法即可。请参阅更新。另外,如果您认为它解决了您的问题,请接受答案,请参阅好的,我理解在单个查询中不可能做到这一点,因为Firestore中的查询很浅。但是,是否可以在聊天集合中添加onSnapshot功能?子集合与查询和侦听器的顶级集合没有什么不同。只需构建对它的引用,并像其他引用一样使用该引用。@paulaysabellemedina正如Doug所解释的,您只需调用
chat
子集合上的
onSnapshot()
方法即可。请参阅更新。此外,如果您认为答案能解决您的问题,请接受,请参阅