Правила базы данных 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 переменная будет содержать все свойства: существующее значение для неуказанных и новое значение для свойства, которое вы пишете.

Другие вопросы по тегам