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