[英]How to return parent collection based on subcollection document value in Firestore?
[英]How to get data from document in a parent collection based on a query in a subcollection
嘿伙计们,我尝试从具有字段值名称和名为kurzwaffensub
的子集合的文档中获取数据,但是对于我的项目,我需要执行一个collectionGroup query
,之后我需要每个文档的Name value
与子集合中的查询匹配.
所以让我解释一下。 首先,我需要根据我在图片中用绿色标记的两个参数kurzHersteller
和kurzModell
对子集合中的documents
进行collectionGroup query
。 之后,我得到与查询匹配的每个Subcollection
的所有Documents
。
如您所见, blue document uid
与子集合的每个文档的字段值中的uid
相同。
而我的目标是在subcollection
的分组查询后得到主集合documents
的红色标记fieldvalue
值。
但我只想接收与查询要求匹配的documents
名称。
所以在这种情况下,我需要名称Felix Sturms
,因为他的subcollection
中有一个document
标记为黄色,与搜索kurzHersteller: Andere
和kurzKaliber: Andere
匹配
我不知道这是否可能,或者我是否需要以另一种方式构造我的数据。 我是 firebase firestore 的初学者,所以也许你可以帮助我。
const [test, setTest] = useState([]);
const HEuKA = query(kurzRef,where("kurzHersteller", "==", `${kurzHersteller}` ), where('kurzKaliber' , '==', `${kurzKaliber}`));
const handleClick = async () => {
...blablabla
...
} else if (kurzHersteller && kurzKaliber) {
const modell = await getDocs(HeuKa);
modell.forEach((doc) => {
// doc.data() is never undefined for query doc snapshots
setTest(doc.id, " => ", doc.data());
});
} else { alert('Bitte etwas eingeben')}
}
所以这是我收到与查询匹配的子集合的文档数组后的第一个操作,我需要另一个操作来从父集合中获取相应的文档,其中包含有关在匹配值kurzHersteller: Andere
和kurzModell: Andere
的子集合。
从集合组查询中获取QuerySnapshot后,您可以遍历每个文档,然后使用每个文档的DocumentReference上存在的.parent
属性访问父文档。 尝试在第一次查询后运行以下代码:
const modell = await getDocs(HeuKa);
const data = [];
for (const doc of modell.docs) {
const parentDoc = await getDoc(doc.ref.parent.parent);
const { Name } = parentDoc.data();
data.push({
...doc.data(),
Name,
});
}
Firestore 读取/查询来自单个集合的返回文档,或来自所有同名的 collections 的集合组查询。 Firestore 中无法在同一读取/查询中包含来自父文档的数据。
您有两个选择:
虽然对于不熟悉 Firestore(以及一般的 NoSQL 数据库)的人来说,#1 是最常见的选择,但随着您对 Firestore 的经验越来越丰富,您通常会发现自己也更经常地使用 #2。
我认为一种更强大的方法是,您不依赖于结构,是从您从查询中返回的每个文档的“uid”字段中获取文档。 更好的是将此字段更改为键入“reference”,在这种情况下您可以这样做(假设您创建一个名为 customerReference 的字段作为 uid 的替代品):
modell.forEach((doc) => {
const name = doc.data().customerReference.get().Name;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.