Firebase Firestore结构多对多

Firebase Firestore结构多对多,firebase,google-cloud-firestore,Firebase,Google Cloud Firestore,在Firebase实时数据库中,我用以下方式组织关系: /projects/{projectId} /users/{userId} /project-members/{userId}/{projectId}/true /users/{userId} /projects/{projectId} /projects/{projectId}/members/{userId}/true (???) 根据Firestore文档() 我应该这样组织: /projects/{projectId} /use

在Firebase实时数据库中,我用以下方式组织关系:

/projects/{projectId}
/users/{userId}
/project-members/{userId}/{projectId}/true
/users/{userId}
/projects/{projectId}
/projects/{projectId}/members/{userId}/true (???)
根据Firestore文档() 我应该这样组织:

/projects/{projectId}
/users/{userId}
/project-members/{userId}/{projectId}/true
/users/{userId}
/projects/{projectId}
/projects/{projectId}/members/{userId}/true (???)
但我正在挣扎,有人能给我一个提示吗

第一次尝试:

return db.collection("projects").add({
  name: "Project Name",
  members: {
    [userId]: true
  }
});
它可以存储,但我发现无法删除。 我相信,因为该项目是一个独特的文件

// It doesn't work
return db.doc(`projects/${projectId}/members/${userId}`).delete()
第二次尝试:

因为true不是对象,所以它不起作用:

db.collection("projects").doc(projectId).collection("members").doc(userId).set(true);
编辑:

根据Michael response,在第一种情况下删除:

return db.doc(`projects/${projectId}`).update({
  [`members.${userid}`]: firebase.firestore.FieldValue.delete()
});

您的第一次尝试创建了一个存储在
/projects/[auto-id]
的文档,其内容为
{name:“Project-name”,成员:{“[user-id]”:true}}

这不是子集合
/projects/[auto id]
是一个单一的原子文档,其中包含所有成员资格。因此,要删除整个项目文档,您可以执行以下操作:

db.doc(`projects/${projectId}`).delete()
要在文档的
成员
字段中添加/删除单个项,可以使用
update()
set()
{merge:true}
选项。但是要确定用户是否是项目的成员,您需要阅读整个文档。任何有权访问该文档的用户都可以看到所有成员,这可能是可取的,也可能是不可取的。此外,您可能会遇到争用问题,因为单个文档只能每秒编写一次

您的第二次尝试更接近实时数据库方法,而且可能更可取。它使用
成员
子集合,每个成员都有一个单独的文档。但正如您所发现的,您不能仅仅将“true”作为文档的内容。所以你需要写一些更充实的东西,比如:

db.collection("projects").doc(projectId).collection("members").doc(userId).set({membership: true});

您可以使用
.remove()
删除这样的文档。使用
.get()

阅读它。注意,您不能
查询子集合。为此,您需要保持集合的原始顺序
/projects/{projectId}
/users/{userId}