2016-05-30 2 views
2

У меня есть конечные точки:Firebase предотвратить дубликаты ключей

/schools/$schoolId/rooms/$roomName/id 
/schools/$schoolId/rooms/$roomName/name {must be unique ignoring case} 
/schools/$schoolId/rooms/$roomName/{other attributes not relevant i think} 

Я хочу, чтобы никакие две комнаты не имеют такое же имя, поэтому я хранящий его в качестве ключа. Я преобразование имен в нижний регистр перед установкой значения и поэтому у меня есть эти правила безопасности:

{ 
    "rules": { 
    ".read": "auth != null", 
    ".write": "auth != null", 
    "schools":{ 
     "$schoolId":{ 
     "rooms":{ 
      "$roomName":{ 
      ".validate": "$roomName===newData.child('name').val().toLowerCase() && !data.parent().child(newData.child('name').val().toLowerCase()).exists()" 
      } 
     } 
     } 
    } 
    } 
} 

Эти правила не позволяют мне писать новые номера.

+0

Вам нужно создать структуру данных помощника для обеспечения уникальности. См. Http://stackoverflow.com/questions/25294478/how-do-you-prevent-duplicate-user-properties-in-firebase –

+0

@FrankvanPuffelen Я бы хотел избежать дублирования данных, если это возможно. Мне было интересно, почему это правило, которое я пытаюсь, не работает. –

+0

Управление дублируемыми данными программы полностью нормально в NoSQL. В этом случае то, что вам нужно построить, очень похоже на «уникальный индекс» в большинстве реляционных баз данных. Единственное отличие состоит в том, что это ваш код, который строит/поддерживает индекс, а не СУБД. См. Эту статью в [Моделирование данных NoSQL] (https://highlyscalable.wordpress.com/2012/03/01/nosql-data-modeling-techniques/). –

ответ

0

Вы можете указать роль названия свойства внутри одной комнаты.
Что-то вроде этого:

"rooms":{ 

//A Room 
"$roomId": { 
    "name": { 
     ".write": "!data.exists()" 
    } 
    } 
} 
Смежные вопросы