2016-06-27 52 views
0

我的數據庫:如何通過數據庫規則僅更新數據中的某些字段?

{ "user" : 
    "$userID": { 
     "name" : "Anon", 
     "age" : 99 
    } 
} 

如果客戶不小心把不正確的數據,但與一些有效的數據,有沒有辦法只有通過有效的數據來更新服務器?

例如,

user1.updateChildValues(["name" : "John Snow", "age" : 30, "BADKEY" : "BAD DATA"]) 

我想上面的更新嘗試的工作,但只有["name" : "John Snow", "age" : 30]使用數據庫安全規則上面的情況更新數據庫。有沒有辦法做到這一點?

+0

不知道,但我怕你不能這樣做。你應該多瞭解一些真正的問題。什麼導致你想要做這種事情? – adolfosrs

+0

我一直在閱讀[分離公共和私人數據](http://stackoverflow.com/questions/19891762/firebase-security-rules-public-vs-private-data)爲兩個完整的不同節點。 AFAIK,用戶數據庫引用將需要分解爲'用戶 - 公共'和'用戶 - 私人',但我試圖看看是否有一個不同的/更好的方式做我的具體用例,由於我如何在客戶端實現東西。最後,我可能不得不改變客戶端代碼並重構我的數據庫。 – hanjustin

回答

1

這聽起來像是你想強制你的數據結構的模式。您可以在安全規則做到這一點,通過驗證性(並拒絕無與倫比的性能):

{ "user" : 
    "$userID": { 
     ".validate": "newData.hasChildren('name', 'age')", 
     "name": { 
      ".validate": "newData.isString()" 
     }, 
     "age" : { 
      ".validate": "newData.isNumber()" 
     }, 
     "$other": { 
      ".validate": false 
     } 
    } 
} 

這裏的$other規則不被更明確的規則進行匹配任何孩子相匹配,然後拒絕他們。

+0

我可能沒有清楚解釋我的問題。當客戶端發送'[「name」:「John Snow」,「age」:30,「BADKEY」:「BAD DATA」]時,我希望數據庫將其解釋爲'[「name」:「John Snow」, 「age」:30]'並相應地更新數據庫。由於額外的鍵值對,您給我的答案給了我''「name」:「John Snow」,「age」:30,「BADKEY」:「BAD DATA」]的'拒絕許可'。我想要一個比你寫的規則更寬鬆的規則。最後,我試圖做的事可能是一個不好的做法,並且Firebase不支持。 – hanjustin

+1

錯誤的數據應被拒絕,而不是默默忽略。 –

相關問題