在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()
});
答案 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()
阅读。