【发布时间】:2019-02-21 16:01:22
【问题描述】:
我的目标:
网络应用(类似于 Google 云端硬盘)有 2 个屏幕。
第一个屏幕是“我的故事”,它显示了我拥有的所有故事文档。
第二个屏幕是“与我共享”,显示我是读者、作者或评论者的所有故事文档。
我们有这个/stories/{storyid}
{
title: "A Great Story",
content: "Once upon a time ...",
roles: {
alice: "owner",
bob: "reader",
david: "writer",
jane: "commenter"
// ...
}
}
完整数据结构参考:https://firebase.google.com/docs/firestore/solutions/role-based-access
问题:如何编写以下查询来实现上述目标?
db
.collection('stories')
.where(`roles.${uid}`, '==', 'owner')
上述查询不起作用,因为它需要 Firestore 索引 roles.alice、roles.bob、roles.david、roles.jane 和 roles.[all_uid]。
编辑#1:找到一个相关帖子(没有答案)询问Firestore querying with roles
【问题讨论】:
-
您提供的链接是关于安全性的,而不是关于查询的。如果要按用户查询此文档,则必须为每个用户编制索引。或者,重构您的数据,以便您可以以不需要用户名作为文档中的字段的方式查询文档。
-
所以基本上你想得到
alice == owner的所有故事,对吧? -
@AlexMamo 是的。想要获取属于所有者的 UID(例如 alice)的所有故事。
-
@DougStevenson 是的,提供的链接是关于安全性的。但是,该链接仅引用您的团队提供的数据结构作为示例。使用示例数据结构,并且想要进行查询,按用户索引是没有意义的。那么如果有 1,000,000 个用户,那么必须创建那么多索引吗?没门!那么如何查询一个文档中的角色,可以返回所有文档都属于一个user_id呢?例如爱丽丝。
-
正如我所说,您需要使用不同的结构来支持您想要执行的查询。在 NoSQL 数据库中,为不同的需求复制数据是很常见的。你有一个安全需求,这很好。现在你有第二个需求,需要第二个解决方案。
标签: firebase google-cloud-firestore angularfire2 angularfire5