google-cloud-firestore - 添加对两个不同集合的文档引用
问题描述
我正在创建一个简单的工作委员会网站。
你有一个JobSeeker、一个JobListing和一个JobApplication
JobSeeker 和 JobListing 都应该有一个 JobApplications 的集合。
当 JobSeeker 申请工作时,我想创建一个 JobApplication 文档,并将其添加到 JobSeeker 的集合和 JobListing 的集合中。
但这应该是对单个文档的引用。(即,如果您在一个地方更新它,它应该在另一个地方更新)。
我如何实现这一目标?
我根据这个答案看到:
我可以在 Firestore 中添加引用作为数据类型 - 但我不确定要使用哪种方法来添加它。
IE。collection.add方法接受DocumentData,但我看不到如何将其设置为参考?
你能告诉我使用什么语法:
- 创建 JobApplication 文档
- 将文档引用添加到集合。
- 从任一集合中检索文档引用。
解决方案
这是我最终解决此问题的方法:
设置数据:
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-collection
JobSeeker 和 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()
方法返回文档快照。
推荐阅读
- node.js - 大数据的 Elasticsearch 索引架构并具有更多的更新/删除操作
- bash - 运行 bash 脚本引发语法错误:操作数预期
- xcode - Xcode 自定义框架以不同方式存储小部件和主应用程序的数据
- python - 在计数函数之前转换数据类型会产生与内联转换不同的结果
- c# - 尝试覆盖 .txt 文件 c# 时出现奇怪的 System.IndexOutOfRangeException
- api - 如何使用 api 提取 Vcenter 整体统计信息
- neo4j - 使用多个 OPTIONAL MATCH 提高 neo4j 查询的性能
- java - Java 中的 getUrlEncoder/getUrlDecoder 问题填充
- wordpress - 联系表格 7 需要 2 个不同字段之一
- javascript - 如何允许用户在 Django 中使用 paypal 相互支付