我是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
方法。
有什么办法可以做到这一点?还是在推送电影之前在客户端中手动查询查询会更容易?
答案 0 :(得分:0)
您不能在安全规则中执行过滤的查询。可以返回数据库的唯一方法是,如果知道要读取的节点的完整路径。因此,我认为您将无法使用安全规则来做到这一点。在添加数据之后,可以考虑使用Cloud Functions反应性地清除无效数据,或将其标记为无效数据。或者,正如您提到的,如果有帮助,请先检查客户端。
答案 1 :(得分:0)
如何使用像Animation_Frozen这样的pushid。您可以在客户端添加两个字符串。
database.ref().child("Animation"+"_"+"Frozen").set(movieData)