Выбрав значение из раскрывающегося списка в моем приложении, мне нужно получить список каждого объекта, который содержит выбранное значение в его внутреннем узле foodtype.
В моей базе данных Firebase есть следующая структура:
restaurants
- key: "12345"
- name: "Salad house"
- address: "Etc etc etc"
- foodtypes
- 0: "Salad"
- 1: "Fastfood"
- 2: "Seafood"
...
Например: если я выберу «Салат», «Фастфуд» или «Морепродукты», я должен получить объект выше в моем списке ресторанов. Но если я выберу «Японскую еду», я не получу ничего (или любую другую запись, которая это содержит).
Есть ли способ сделать это в Firebase без создания множества объединенных полей / значений? Буду очень признателен за любые предложения!
Если я выберу «Салат», я хочу получить весь объект ресторана, потому что он содержит это значение во внутреннем узле foodtypes.
Я не уверен, возможно ли это, но если вы удалите foodtypes и просто добавите - 0: "Salad" - 1: "Fastfood" - 2: "Seafood", это будет возможно
Я мог бы удалить узел foodtypes, как вы говорите, и создать 3 поля с именами foodtype1, foodtype2, foodtype3, но, сделав это, я бы установил фиксированное количество food types, разрешенное для каждого restaurant.



![Безумие обратных вызовов в javascript [JS]](https://i.imgur.com/WsjO6zJb.png)


Это возможно с помощью запроса Cloud Firestore, а не запроса Firebase RTDB (база данных в реальном времени).
Если вы хотите приблизиться к этому с помощью Firebase RTDB, ваша база данных должна выглядеть так.
restaurants
- key: "12345"
- name: "Salad house"
- address: "Etc etc etc"
- foodtype: 0 (or 1 or 2 ...)
...
Вы также можете использовать такие строки, как «Салат», «Фастфуд», «Морепродукты», но поскольку имя может быть изменено в будущем, я бы использовал целое число в качестве постоянной переменной и определил бы его в вашем коде javascript как const FOODTYPE_SALAD = 0, const FOODTYPE_FASTFOOD = 1.
Наконец, вы можете получить список, как показано ниже.
return restaurantsRef.orderByChild('foodtype').equalTo(FOODTYPE_SALAD).once('value').then(snap => {
// TODO: ...
});
Но у этого способа есть недостатки.
Например, вы не можете отсортировать список как хотите. Что делать, если вы хотите отсортировать список ресторанов по дате регистрации?
Поэтому лучшим вариантом для Firebase RTDB в этой ситуации является денормализация базы данных и выравнивание базы данных.
Вам понадобится Разветвление на стороне сервера в облачных функциях для Firebase.
Это окончательный вид таблиц вашей базы данных.
restaurants
- key: "12345"
- name: "Salad house"
- address: "Etc etc etc"
- foodtype: 0
- key: "22222"
- name: "Fastfood house"
- address: "Etc etc etc"
- foodtype: 1
- key: "33333"
- name: "Seafood house"
- address: "Etc etc etc"
- foodtype: 2
restaurants-salad
- key: "12345"
- name: "Salad house"
- address: "Etc etc etc"
- foodtype: 0
restaurants-fastfood
- key: "22222"
- name: "Fastfood house"
- address: "Etc etc etc"
- foodtype: 1
restaurants-seafood
- key: "33333"
- name: "Seafood house"
- address: "Etc etc etc"
- foodtype: 2
...
Помните, что restaurants должен иметь все исходные объектные данные restaurant.
Я действительно изо всех сил пытаюсь принять этот уровень денормализации (я работаю с реляционными базами данных целую вечность), но я думаю, что должен пойти на это.
@Marcelo Помните, что денормализация - это нормально для базы данных NoSQL, она повышает производительность, чем rdb.
проверьте это: firebase.googleblog.com/2013/04/…
Я должен быть благодарен за то, что принял мой ответ, если он был вам полезен :)
если вы выберете
Salad, вы хотите получать пищевые типы?