Правила базы данных Firebase: Как предотвратить удаление определенного дочернего элемента (иначе говоря, NULL)?
Я пытаюсь определить схему в firebase, которая будет препятствовать тому, чтобы определенные дочерние свойства были нулевыми (как ограничение NOT NULL в SQL).
Схема должна выглядеть так:
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']
править.
Хотя у меня есть доступ ко всему объекту в моем приложении, это досадное неудобство.
Есть ли лучший подход для решения этой проблемы?
1 ответ
Проблема с этим подходом состоит в том, что каждый раз, когда я хочу исправить определенное значение (например, псевдоним), я должен предоставлять ненулевые свойства (которые не изменяются) из-за
newData.hasChildren(['name', 'phone']
править.
Вы, кажется, неправильно понимаете значение newData
в правилах. Из справочной документацииnewData
:
RuleDataSnapshot
соответствует данным, которые будут получены, если запись разрешена.
Поэтому, если вы записываете только одно свойство в местоположение, которое уже содержит все свойства, newData
переменная будет содержать все свойства: существующее значение для неуказанных и новое значение для свойства, которое вы пишете.