[英]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
不同,我很难理解如何检查所有电影。 而且,在模拟器中,我已经看到我只能测试read
, set
和update
方法。
有什么办法可以做到这一点? 还是在推送影片之前在客户端中手动查询查询会更容易?
您无法在安全规则中执行过滤的查询。 可以返回数据库的唯一方法是,如果知道要读取的节点的完整路径。 因此,我认为您将无法使用安全规则来做到这一点。 在添加数据之后,可以考虑使用Cloud Functions反应性地清除无效数据,或将其标记为无效数据。 或者,正如您提到的,如果有帮助,请先检查客户端。
如何使用像Animation_Frozen这样的pushid。您可以在客户端添加两个字符串。
database.ref().child("Animation"+"_"+"Frozen").set(movieData)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.