繁体   English   中英

Firebase验证规则,以检查是否已经存在具有相同标题的电影

[英]Firebase validation rule to check if movie with same title already exists

我是Firebase的新手。 我正在开发一个搜索电影并将其保存在实时数据库中的应用程序。 要保存的数据采用以下结构:

var movieData = {
    title: "Frozen",
    genre: "Animation"
};

我以这种方式保存电影:

database.ref().child("movies").push(movieData);

这样就可以了。 如果我尝试将其保存两次,则会出现问题,因此,在我的数据库中,电影将被复制:

{
  "movies" : {
    "-LYSENT90rjBj_fIAHpY" : {
      "genre" : "Animation",
      "title" : "Frozen"
    },
    "-LYSEPufvX3p3w-yXf4d" : {
      "genre" : "Animation",
      "title" : "Frozen"
    }
  }
}

我正在尝试创建一个验证规则,以检查是否已经存在一些具有相同标题的电影 我最后的尝试是这样的:

{
  "rules": {
    ".read": true,
    ".write": true,
    "movies": {
      "$pushid" : {
        ".validate": "root.child('movies/' + newData.child('title').val()).val() === null"
      }
    }
  }
}

如果每个电影的pushid不同,我很难理解如何检查所有电影。 而且,在模拟器中,我已经看到我只能测试readsetupdate方法。

有什么办法可以做到这一点? 还是在推送影片之前在客户端中手动查询查询会更容易?

您无法在安全规则中执行过滤的查询。 可以返回数据库的唯一方法是,如果知道要读取的节点的完整路径。 因此,我认为您将无法使用安全规则来做到这一点。 在添加数据之后,可以考虑使用Cloud Functions反应性地清除无效数据,或将其标记为无效数据。 或者,正如您提到的,如果有帮助,请先检查客户端。

如何使用像Animation_Frozen这样的pushid。您可以在客户端添加两个字符串。

database.ref().child("Animation"+"_"+"Frozen").set(movieData)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM