首页 > 解决方案 > 需要帮助访问 Firestore 子集合?

问题描述

在编码方面我是新手(大约一年前开始自学),任何帮助将不胜感激,在此先感谢您。

我看到关于如何访问 Firestore 的子集合的堆栈溢出还有 3-4 篇其他帖子。我尝试了所有这些但没有运气,因此我将其作为一个新问题发布。

现在我的数据集设置为:collection/document.array。到目前为止还不错,因为我只需要从数组中读取该数据,然后在我的小 React 项目中使用 .reduce 和 .map 将其绘制出来,并在输入时将新数据推送到该数组。 在此处输入图像描述 在此处输入图像描述

这是我现在从 Firestore 获取数据的代码:

--- in firebase.js ----------------------------------------------------------------------
export const fire = firebase.initializeApp(config);
export const db = fire.firestore()
_________________________________________________________________________________________

--- in events-context.js ----------------------------------------------------------------

 const fetchEvents = async () => {
    try {
      const data = await db.collection('events').get();
      setEvents(data.docs.map(doc => ({ ...doc.data(), id: doc.id })));
    } catch ({ message }) {
      alert(`Error @ fetchEvents, Error:${message}`);
    } 
  };

但现在我想添加编辑和删除功能,但为了做到这一点,我需要将我的数据数组执行到子集合中,以便该数组中的每个单独元素都有自己的 id,以便我以后可以定位它。所以它需要像这样设置:collection/document/sub-collection 在此处输入图像描述

标签: javascriptreactjsfirebasegoogle-cloud-firestore

解决方案


要访问集合内的文档,您必须知道其他来源的文档 ID。这可以通过管理字符串或映射数组中的名称来完成,然后您可以根据您的设计在应用程序中处理这些名称。

例如:一旦创建,您将拥有引用的快照,您可以将文档 ID 存储在父文档中:

db.collection("events").doc(id).update({
    payers: firebase.firestore.FieldValue.arrayUnion(paySnapshot.ref.id)
})`

获得此信息后,您可以使用以下技术之一将其附加到相关文档路径。

  • db.collection("events").doc(id).collection("payers").doc(pay_id).get()
  • db.doc(\事件/${id}/payers/${pay_id}`).get()`

我强烈建议不要在没有条件的情况下使用集合.get()来减少可能发生的读取。limit()where()


推荐阅读