Запрос Firebase по значениям внутреннего массива

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

В моей базе данных Firebase есть следующая структура:

restaurants
  - key: "12345"
    - name: "Salad house"
    - address: "Etc etc etc"
    - foodtypes
        - 0: "Salad"
        - 1: "Fastfood"
        - 2: "Seafood"
...

Например: если я выберу «Салат», «Фастфуд» или «Морепродукты», я должен получить объект выше в моем списке ресторанов. Но если я выберу «Японскую еду», я не получу ничего (или любую другую запись, которая это содержит).

Есть ли способ сделать это в Firebase без создания множества объединенных полей / значений? Буду очень признателен за любые предложения!

если вы выберете Salad, вы хотите получать пищевые типы?

Peter Haddad 11.03.2018 18:57

Если я выберу «Салат», я хочу получить весь объект ресторана, потому что он содержит это значение во внутреннем узле foodtypes.

Marcelo 11.03.2018 18:58

Я не уверен, возможно ли это, но если вы удалите foodtypes и просто добавите - 0: "Salad" - 1: "Fastfood" - 2: "Seafood", это будет возможно

Peter Haddad 11.03.2018 19:04

Я мог бы удалить узел foodtypes, как вы говорите, и создать 3 поля с именами foodtype1, foodtype2, foodtype3, но, сделав это, я бы установил фиксированное количество food types, разрешенное для каждого restaurant.

Marcelo 11.03.2018 19:08
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
Улучшение производительности загрузки с помощью Google Tag Manager и атрибута Defer
В настоящее время производительность загрузки веб-сайта имеет решающее значение не только для удобства пользователей, но и для ранжирования в...
Безумие обратных вызовов в javascript [JS]
Безумие обратных вызовов в javascript [JS]
Здравствуйте! Юный падаван 🚀. Присоединяйся ко мне, чтобы разобраться в одной из самых запутанных концепций, когда вы начинаете изучать мир...
Система управления парковками с использованием HTML, CSS и JavaScript
Система управления парковками с использованием HTML, CSS и JavaScript
Веб-сайт по управлению парковками был создан с использованием HTML, CSS и JavaScript. Это простой сайт, ничего вычурного. Основная цель -...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
0
4
436
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это возможно с помощью запроса 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 11.03.2018 19:47

@Marcelo Помните, что денормализация - это нормально для базы данных NoSQL, она повышает производительность, чем rdb.

wonsuc 11.03.2018 19:51

проверьте это: firebase.googleblog.com/2013/04/…

Peter Haddad 11.03.2018 19:54

Я должен быть благодарен за то, что принял мой ответ, если он был вам полезен :)

wonsuc 10.05.2018 18:11

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