Firebase Firestore结构多对多
在Firebase实时数据库中,我用以下方式组织关系: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
/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}