【问题标题】:How to get data from document in a parent collection based on a query in a subcollection如何根据子集合中的查询从父集合中的文档中获取数据
【发布时间】:2022-01-07 16:56:04
【问题描述】:

大家好,我尝试从具有字段值名称和名为 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 匹配的文档。

【问题讨论】:

    标签: javascript reactjs firebase google-cloud-firestore filtering


    【解决方案1】:

    从集合组查询中获得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,
      });
    }
    

    【讨论】:

    • 谢谢,我不知道这是可能的。但作为一个该死的初学者,总有一些新东西要学。我稍后会尝试这个解决方案,让你知道是否可以实现它:)
    【解决方案2】:

    Firestore 读取/查询返回来自单个集合的文档,或来自所有同名集合的集合组查询。 Firestore 中无法在同一读取/查询中包含来自父文档的数据。

    您有两个选择:

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

    虽然对于不熟悉 Firestore(以及一般的 NoSQL 数据库)的人来说,#1 是最常见的选择,但随着您对 Firestore 的经验越来越丰富,您通常会发现自己使用 #2 的频率也越来越高。

    【讨论】:

    • 谢谢我首先考虑了您的第二个解决方案,但我不确定这是否是最佳方式。但无论如何很高兴知道:)
    【解决方案3】:

    我认为一种更强大的方法是,您不依赖于结构,是从您从查询中返回的每个文档的“uid”字段中获取文档。更好的是将此字段更改为键入“reference”,在这种情况下您可以这样做(假设您创建一个名为 customerReference 的字段作为 uid 的替代品):

     modell.forEach((doc) => {
       const customerDoc = await doc.data().customerReference.get();
       const name = customerDoc.data().Name;
    

    【讨论】:

    • 如果我想查询它,是否可以从具有相同字段值customerReference 的不同集合中获取文档?
    • 是的,'reference'类型的customerReference可以指向任何集合,它包含文档的完整路径。
    • 谢谢你知道这很重要。我可能会在不久的将来遇到这个问题,那么我可能会再次需要你的帮助:D 由于这个特定的问题,我将另一条评论标记为正确的评论。但您的解决方案与其他解决方案一样正确。
    • 嘿伙计,又是我。我尝试使用您的解决方案,但似乎我很愚蠢才能完成工作,也许您可​​以再次帮助我,我详细发布了一个新问题。也许你可以指出我正确的方向。会很高兴:)
    猜你喜欢
    • 2023-03-08
    • 2021-04-21
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 2020-09-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多