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

时间:2020-03-03 11:35:15

标签: javascript firebase google-cloud-firestore

上下文:以下是我在Firebase Firestore中的收藏和文档的屏幕截图。基本上,每个交易文档都有其自己的字段和内部的聊天收集。

我需要的:我的目标是使用特定的handler_id查询文档并访问其中的聊天集。

发生了什么:此查询仅返回交易字段

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

如何将聊天集合包含在查询的文档中?您对我如何更有效地组织数据有任何建议吗? enter image description here

1 个答案:

答案 0 :(得分:2)

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