繁体   English   中英

如何根据子集合中的查询从父集合中的文档中获取数据

[英]How to get data from document in a parent collection based on a query in a subcollection

嘿伙计们,我尝试从具有字段值名称和名为kurzwaffensub的子集合的文档中获取数据,但是对于我的项目,我需要执行一个collectionGroup query ,之后我需要每个文档的Name value与子集合中的查询匹配.

我目前的结构

所以让我解释一下。 首先,我需要根据我在图片中用绿色标记的两个参数kurzHerstellerkurzModell对子集合中的documents进行collectionGroup query 之后,我得到与查询匹配的每个Subcollection的所有Documents

如您所见, blue document uid与子集合的每个文档的字段值中的uid相同。

而我的目标是在subcollection的分组查询后得到主集合documents的红色标记fieldvalue值。

但我只想接收与查询要求匹配的documents名称。

所以在这种情况下,我需要名称Felix Sturms ,因为他的subcollection中有一个document标记为黄色,与搜索kurzHersteller: AnderekurzKaliber: 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: AnderekurzModell: 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 中无法在同一读取/查询中包含来自父文档的数据。

您有两个选择:

  1. 阅读父文档以了解您从子集合中获得的任何结果。
  2. 在子集合中的每个文档中复制父文档中的必要信息。

虽然对于不熟悉 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM