说我有这样的用户集合:
users{
userId1234 : {
name: "Joe",
interests: "Programming",
score: 1337
}
}
是否可以编写允许
的规则let user = {name:"Joey",interests:"Code"};
db.ref("users/").child("userId1234").update(user);
但不允许:
let user = {name:"Joey",interests:"Code",score:9000};
db.ref("users/").child("userId1234").update(user);
基本上,我想保护某个字段不被写入(在本例中得分)。我知道我可以选择将该字段移到另一个集合中,但如果可能的话,我更愿意这样做。
以下是我迄今为止尝试过的方法:
"users":{
".write":"auth!=null",
"$userId":{
"score":{".write":false},
"$otherFields":{".write":"auth != null"}
}
}
^这会阻止写入/ users / userId / score,但它不会使用包含score属性的对象阻止/ users / userId。
"users":{
".write":"false",
"$userId":{
"score":{".write":false},
"$otherFields":{".write":"auth != null"}
}
}
^这允许我正确地写入字段,但完全阻止.update()。
谢谢! -Joe
答案 0 :(得分:1)
我的解决方案
"users":{
"$userId":{
".write":"auth!=null",
".validate":"newData.child('score').val()
===data.child('score').val()",
"score":{".write":false},
"$otherFields":{".write":"auth != null"}
}
}
“。validate”:“!newData.hasChildren(['score'])”不起作用,因为“newData”实际上是更新数据的未来合并结果,而不是发布的原始数据,如果你已经有一个分数,它会失败。