首页 > 解决方案 > 添加对两个不同集合的文档引用

问题描述

我正在创建一个简单的工作委员会网站。

你有一个JobSeeker、一个JobListing和一个JobApplication

JobSeeker 和 JobListing 都应该有一个 JobApplications 的集合。

当 JobSeeker 申请工作时,我想创建一个 JobApplication 文档,并将其添加到 JobSeeker 的集合和 JobListing 的集合中。

但这应该是对单个文档的引用。(即,如果您在一个地方更新它,它应该在另一个地方更新)。

我如何实现这一目标?

我根据这个答案看到:

具有相同参考的 Cloud Firestore 多个文档

我可以在 Firestore 中添加引用作为数据类型 - 但我不确定要使用哪种方法来添加它。

IE。collection.add方法接受DocumentData,但我看不到如何将其设置为参考?

你能告诉我使用什么语法:

  1. 创建 JobApplication 文档
  2. 将文档引用添加到集合。
  3. 从任一集合中检索文档引用。

标签: google-cloud-firestore

解决方案


这是我最终解决此问题的方法:

设置数据:


    const docData = {
      listingId: "someExistingId", 
      jobSeekerId: "anotherExistingId", 
      otherData: "whatever other data goes here", 
    }

    const docRef = await db.collection("job-application-collection")
        .add(docData); 
    await db.collection(`job-seeker-collection/${docData.jobSeekerId}/applications`)
        .add({ref:docRef}); 
    await db.collection(`job-listing-collection/${docData.listingId}/applications`)
        .add({ref:docRef}); 

也就是说,我们所做的是创建一个“真实”文档,该文档进入job-application-collectionJobSeeker 和 JobListing 集合中,我们添加一个“指针文档”,它只包含一个字段ref,包含文档引用。

要检索它(在本例中,检索给定 JobSeeker 的所有应用程序):

  const jobSeekerId = "someJobSeekerId"; 
  const colRef = await db.collection(`job-seeker-collection/$jobSeekerId}/applications`);
  const colSnapshot = await colRef.get();  

  /**
   * The docs on the collection are actually just documents containing a reference to the actual JobApplication document. 
   */
  const docsProms = colSnapshot.docs.map((async (colDocData) => {
    const snapshot =  await colDocData.data().ref.get(); 
    return {
      ...snapshot.data(), 
      id: snapshot.id, 
    }
   })); 

  const data = await Promise.all(docsProms); 

  return data; 

很简单,我们在 JobSeeker 文档上获取集合,然后在每个文档上都有一个ref字段,我们可以使用该.get()方法返回文档快照。


推荐阅读