2017-05-03 48 views
0

我想在firebase中定義一個模式,以防止某些子屬性爲空(如SQL中的NOT NULL約束)。Firebase數據庫規則:如何防止某個孩子被刪除(a.k.a NOT NULL)?

的模式應該是這樣的:

Property | allow null | type 
---------+------------+-------- 
name  | false  | string 
phone | false  | string 
alias | true  | string 
birthday | true  | number (timestamp) 

此外,只有用戶自己應該能夠讀取和寫入自己的聯繫人。

目前,該數據庫中有一些虛擬的數據:

{ 
    "contacts" : { 
    "user1" : { 
     "contact1" : { 
     "alias" : "Bobby", 
     "name" : "Bob", 
     "phone" : "12312324" 
     } 
    } 
    } 
} 

,我想出了看起來像這樣的解決方案:

{ 
    "rules": { 
    "contacts": { 
     "$user": { 
     "$contact": { 
      ".read": "auth.uid == $user", 
      ".write": "auth.uid == $user && newData.hasChildren(['name', 'phone'])", 
      "name": { 
      ".validate": "newData.isString()" 
      }, 
      "phone": { 
      ".validate": "newData.isString()" 
      }, 
      "alias": { 
      ".validate": "newData.isString()" 
      }, 
      "birthday": { 
      ".validate": "newData.isNumber()" 
      }, 
      "$other": { 
      ".validate": "false" 
      } 
     } 
     } 
    } 
    } 
} 

這種方法的問題是,每次我想要修補某個值(例如別名),我必須提供非空屬性(不會更改),這是由於規則newData.hasChildren(['name', 'phone']

雖然我可以訪問我的應用程序中的整個對象,但這是一個令人討厭的不便之處。

有沒有更好的方法來解決這個問題?

+0

Firebase沒有模式,因此通常最好不要在NoSQL數據庫上強制使用SQL概念 - 思考並設計NoSQL的結構!例如;試圖阻止某些兒童屬性爲空。爲什麼?如果數據不存在會發生什麼?如果你想確保它有數據,什麼數據? Firebase不允許使用空字符串,這意味着您需要將某些內容作爲子值佔位符。對於NoSQL,缺少子節點通常比佔位符好。用代碼處理這些案件; if!phoneChildNode.exists()然後讓phoneVar =「沒有電話提供」 – Jay

回答

1

這種方法的問題是,我想修補一定值(例如別名)每一次,我必須提供不空屬性(即不改變)因newData.hasChildren(['name', 'phone']規則。

您似乎誤解了規則中newData的含義。從reference documentation of newData

RuleDataSnapshot對應於將導致如果寫允許的數據。

所以,如果你寫的只是一個單一的財產已包含所有屬性的位置,該newData變量將包含所有屬性:未指定的那些現有的價值,併爲你的屬性的新值寫作。

+0

然後爲什麼模擬器顯示寫入被拒絕(使用虛擬數據)? [截圖](http://i.imgur.com/kh6td0u.png) – 123

+1

因爲你正在模擬整個用戶的'set()'操作。這將取代整個聯繫人,包括'name'和'phone'屬性。要模擬一個'update()',將''value''寫入'contacts/user1/contact1/alias'。 –

+0

謝謝,這清除了很多困惑和沮喪。 – 123