使用 Angular (@angular/fire) 在 firestore 中添加、更新和读取 sub-collection

Add, update and read sub-collection in firestore using Angular (@angular/fire)

我正在尝试学习 firebase。我正在使用 Angular 和 Firebase 制作类似 Linkedin 的项目。

我在我的项目中使用@angular/fire包。

到目前为止,我已经完成了身份验证并添加了用户的一些基本信息。我有 users collection,其中每个 documentId 都有 nameemail 等信息

现在我的下一个目标是创建一个工作经验部分。由于一个用户可以有多个工作经验。

我必须决定在每个用户文档 ID 下继续使用 sub-collection,而不是为 work-experience.

创建单独的 collection

现在我在如何在 users collection.

中添加 sub-collection 时遇到了一些麻烦

一个用户一次只能add/update一次体验。我的 UI 将类似于 Linkedin。单击 'Add Experience' 按钮时,将弹出一个模式,并且表单内将有一个表单,其中包含 jobTitlecompanyName 等字段。所以一旦提交被点击,我想要使用唯一的 documentId 将数据保存在 work-experience sub-collection 下。

目前我正在这样添加我的基本信息

添加

addUser(user: any): Observable<void> {
   const ref = doc(this.firestore, 'users', user.uid);
  return from(setDoc(ref, user));
}

正在更新

 updateUser(user: any): Observable<void> {
    const ref = doc(this.firestore, 'users', user.uid);
    return from(updateDoc(ref, { ...user }));
 }

现在我想在 users collection 下添加名为 work-experience 的 sub-collection。

根据您的 ,我认为您需要添加一个 sub-collection,其中包含 ID 为 work-experience 的文档。

如果我的假设是正确的,请按照以下步骤创建此文档的DocumentReference

const workExperienceDocRef = doc(this.firestore, `users/${user.uid}/sub-sections/work-experience`);

注意:一定要使用back ticks.

然后你可以设置这个文档的数据如下,例如:

return from(setDoc(workExperienceDocRef, {experiences: [{years: "2015-2018", company: "comp1"}, {years: "2018-2021", company: "comp2"}]}));

如果要为用户的文档创建sub-collection,请执行以下操作:

const userSubCollection = collection(this.firestore, `users/${user.uid}/sub-collection`);

然后你可以使用addDoc()方法,它会自动生成文档ID。:

const docRef = await addDoc(userSubCollection, {
  foo: "bar",
  bar: "foo"
});