Firestore构建多对多

时间:2017-10-09 15:24:36

标签: firebase google-cloud-firestore

在Firebase实时数据库中,我习惯于以这种方式组织关系:

/projects/{projectId}
/users/{userId}
/project-members/{userId}/{projectId}/true

根据Firestore文档(https://firebase.google.com/docs/firestore/manage-data/structure-data#subcollections) 我应该这样构建:

/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的回应,在第一种情况下删除:

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

1 个答案:

答案 0 :(得分:3)

您的第一次尝试会创建一个存储在/projects/[auto-id]且内容为{name: "Project Name", members: { "[user-id]": true } }

的文档

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

db.doc(`projects/${projectId}`).delete()

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

您的第二次尝试更接近实时数据库方法,可能更可取。它使用members子集合,每个成员都有一个单独的文档。但是,正如你发现的那样,你不能写出真实的"作为文件的内容。所以你需要写一些更实质的内容,如:

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

您可以使用.remove()删除此类文档。并使用.get()阅读。

相关问题