【发布时间】:2020-08-15 02:41:03
【问题描述】:
我有一个集合reviews,其中每条评论都包含uids 喜欢它的用户列表,称为likes。架构如下所示:
- 评论(收藏)
- 标题
string - 作者
uid - 点赞 [
uid] - 发帖
timestamp
- 标题
- 用户(收藏)-
uid- 已创建
timestamp - 电子邮件
string
- 已创建
目前,我正在处理喜欢评论的用户:
firebase.firestore().doc(rid).update({
likes: firebase.firestore.FieldValue.arrayUnion(this.fetchCurrentUID())
});
并且不喜欢:
firebase.firestore().doc(rid).update({
likes: firebase.firestore.FieldValue.arrayRemove(this.fetchCurrentUID())
});
我只想让用户在likes 中添加或删除他们自己的uid。
如何编写安全规则来确保这一点?具体来说,我需要查看 列表是如何更新的,例如:
let newVals = request.resource.data.new_values // or something
return (newVals.length == 1 && newVals[0] == request.auth.uid)
【问题讨论】:
-
请编辑问题以更具体。显示您正在使用的特定客户端请求、您正在使用的文档结构,以及您已经尝试过但未按预期方式工作的更完整的安全规则。
-
@DougStevenson 完成!但是,我不确定您所说的“您已经尝试过但未按预期方式工作的安全规则”是什么意思,因为在这种情况下,我有一个我不知道该怎么做的特定操作。跨度>
-
在 Stack Overflow 上,您应该尝试解决问题,这有助于阐明您正在尝试做什么,以及您如何考虑可能的解决方案。
-
@DougStevenson 请解释我在哪里可以更好地“解决问题”,或者问你仍然不明白的地方。人们可能会遍历新旧数组中的每个值并查看它们的不同之处,但根据stackoverflow.com/a/49227926/7834942,firestore 不提供安全规则中的迭代。 Firestore 安全规则非常不灵活,很难尝试一起破解。
-
@Néstor 有一个解决方法,您可以将所有关系放在他们自己的集合或子集合中,即具有字段:用户,user_likes_content _id 然后对于添加到集合中的每个添加元素,规则变得很容易执行.然而,对于大小为 n 的数组,我们将执行 n 次 DBS 读取以获取数组,而不是 1。
标签: firebase google-cloud-firestore nosql firebase-security