簡短的回答是否定的,除非您正在編寫的數據包含第一個/最後一個鍵,否則您將無法在任何時間寫入數據。
但是,這可能不是很清楚,因爲在文檔中似乎有一個小小的錯誤。安全規則的編寫方式如下:
{
...
"name": {
// existing data must have first/last keys before write is allowed
// since validate rule is not applied to delete ops, this record can be deleted
".validate": "data.hasChildren(['first', 'last'])"
"first": { ... }
"last": { ... }
// no keys other than first/last may be written
"$other": {
".validate": false
}
}
}
在這種情況下,如果你能以某種方式得到一個姓氏和名字到記錄(比如作爲管理員),在此之後的任何寫操作將被允許,無論是否有第一個/最後一個。但是,這看起來像一個錯字。而是指data variable,可呈現引用現有數據,我認爲這是意指newData variable,或數據被寫入,像這樣:
// data to be written must have first/last keys before write is allowed
// since validate rule is not applied to delete ops, this record can be deleted
".validate": "newData.hasChildren(['first', 'last'])"
在這一點上,newData(什麼你寫到那個路徑)必須有第一個/最後一個名字。這也假設在層次結構中存在允許寫入訪問的「.write」規則。
這條規則是高一點了教程:
// any authenticated user can write to their own record
".write": "$user == auth.username",
這看起來並不像一個錯字都沒有。與「其他」規則相結合意味着我最初發布的問題會成功,因爲它不是在查看newData,而是數據(最初我錯過了一點)。 「$ other」規則消除了將垃圾數據放入其中的可能性(這並不在示例中,而應該是這樣),但允許更新名字或姓氏而不更新兩者,這正是我想要的知道。 –
正確,但通過查看數據,它永遠不會允許您首先寫入記錄(除非它是由某個管理進程寫入的);你幾乎不能寫一個記錄,除非它已經有第一個/最後一個。 – Kato
我想出了允許更新單個項目和創建項目本身的正確語法。'「.validate」:「data.hasChildren(['action'])|| newData.hasChildren(['action']) 「,」如果這種方法能夠消除兩次基本相同功能的樣板,那將會很好。 –