Firebase规则-仅在某些字段上允许.update()

Firebase规则-仅在某些字段上允许.update(),firebase,firebase-realtime-database,firebase-security,Firebase,Firebase Realtime Database,Firebase Security,假设我有这样一个用户集合: users{ userId1234 : { name: "Joe", interests: "Programming", score: 1337 } } 是否可以编写允许 let user = {name:"Joey",interests:"Code"}; db.ref("users/").child("userId1234").update(user); 但不允许: let user = {name

假设我有这样一个用户集合:

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);
本质上,我想保护某个字段不被写入(本例中为score)。我知道我可以选择将字段移出到另一个集合,但如果可能的话,我更愿意这样做

以下是我迄今为止尝试过但不起作用的方法:

"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()

谢谢! -乔

我的解决方案

"users":{
        "$userId":{
          ".write":"auth!=null",
          ".validate":"newData.child('score').val()
                       ===data.child('score').val()",
          "score":{".write":false},
          "$otherFields":{".write":"auth != null"}
        }
}  

“.validate”:“!newData.haschilds(['score'])”不起作用,因为“newData”实际上是更新数据的未来合并结果,而不是发布的原始数据,如果您已经有了分数,它将失败。

Hi Joe。你应该将你的解决方案作为答案发布,而不是直接包含在你的帖子中。实际上,在堆栈溢出中鼓励使用。干杯!:)知道了。谢谢@AL.:D