【问题标题】:I want to write a rule that will don't allow add same document second time我想写一个不允许第二次添加相同文档的规则
【发布时间】:2019-07-03 07:52:22
【问题描述】:
rules_version = '2';
service cloud.firestore {
  match /databases/{database}/documents {
    match /users/{usersID} {
    allow read;
    allow write: if request.auth.uid != null;
        match /desksCollection/{desksCollectionID} {
        allow read;
        allow write: if resource.data.DeskName != request.resource.data.DeskName;
      }
    }
  }
}

我想写一条规则,不允许第二次添加相同的文档。 这里有什么不正确的地方?

【问题讨论】:

  • 你能提供错误吗?
  • 请编辑问题以显示应受规则限制的代码。如果没有一些与之相伴的代码,规则就毫无意义。也可能是您的代码根本不正确。请具体说明您要拒绝写入的条件。现在,您的规则只是拒绝写入正在更改 DeskName 字段的文档。
  • 道格·史蒂文森感谢您的回复。在我的“desksCollection”集合中,我有一个带有 DeskName 字段的文档,我只是想检查是否有人想在 DeskName 字段中添加具有相同值的文档拒绝该帖子

标签: google-cloud-firestore firebase-security


【解决方案1】:

安全规则无法实现您尝试做的事情。这将要求您能够在desksCollection 上对符合具有特定值的字段的条件的文档执行查询。但是,无法在安全规则中执行查询。您可以通过 ID 获取文档,但这对您没有帮助,因为您不知道要获取哪个文档。

如果您要求deskName 是唯一的,请考虑使用该值作为文档的ID。然后,如果文档已经存在,您可以编写一个规则来阻止更新。

【讨论】:

    【解决方案2】:

    这是我避免重复标记的方法你可以在任何领域做到这一点。

    首先查询文档,如果是null,则添加该集合。

    @override
      void initState() {
        // TODO: implement initState
        super.initState();
        firebaseMessaging.getToken().then((token){
          print(token);
          bool isAvailabe;
          Firestore.instance.collection("tokens").where("token",isEqualTo: token).getDocuments().then((snap){
            if(snap == null){
              Firestore.instance.collection('tokens').add({"token":token}).catchError((error){
                print(error);
              }).catchError((e){
                print(e);
              });
            }
          });
    
        });
    
      }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-25
      • 1970-01-01
      相关资源
      最近更新 更多