Cloud Firestore规定正确的语法

我需要为Cloud Firestore编写规则。

我希望我的规则允许在集合中创建新文档:

newDoc(field1="value-1",field2="value-2",field3="other-miscellaneous-values")

仅当集合中不存在具有以下条件的其他文档时:

(field1 == "value-1") and (field2 == "value-2")

尽管这不是很复杂,但它似乎仍然太复杂了,以至于在我发现的所有搜索网络的教程中都找不到这个例子。

此外,如果用户愿意,可以自由列出和阅读馆藏中的所有文档。

这是我尝试过的方法,但是不起作用:

service cloud.firestore {
  function alreadyExists(document) {
              return exists((resource.data.field1==request.resource.data.field1)&&
                           (resource.data.field2==request.resource.data.field2))
  }

  match /databases/{database}/documents {
    match /My_Collection/{anything=**} {
      allow read;
      allow write: if !(alreadyExists(request.resource.data));
    }
  }
}

我希望有人能给我一些建议,以使其正常工作。

zhuwenjiez 回答:Cloud Firestore规定正确的语法

这对于安全规则是不可能的,因为规则无法执行任意查询。如果您知道要获取的文档的路径,则唯一支持的查询类型是简单的get()。

您可以做的是编写一些后端代码(也许是Cloud Function)来执行此检查,并使客户端针对该集合的所有写操作都通过该后端。或者,如果文档与集合中的其他文档冲突,则可以编写一个Firestore触发器来检查文档,然后将其删除。

,

安全规则只能检查某个路径下的文档是否存在(带有exists)。无法检查规则中是否存在具有特定值的文档。

针对您的用例,我的典型解决方案是将要唯一的字段组合用作文档的ID。根据定义,由于文档ID在给定集合中是唯一的,因此可以确保您的键组合在同一集合中是唯一的。

如果您已经拥有无法更改的ID策略,请考虑添加一个包含唯一组合的辅助集合,如我在此处的回答Prevent duplicate entries in Firestore rules not working所示。

本文链接:https://www.f2er.com/3063569.html

大家都在问