Запрос вложенного значения в дочерних элементах базы данных Firebase Realtime, где ключи случайные - PullRequest
1 голос
/ 23 марта 2020

У меня проблема с запросом вложенных данных из базы данных Firebase Realtime.

Учитывая следующую структуру данных примера:

"crossing":
        "1346":
            "data1": "value"
            "data2": "value"
            "projectName": "PN-1"
        "1562":
            "data1": "value"
            "data2": "value"
            "projectName": "PN-1"
        "1933":
            "data1": "value"
            "data2": "value"
            "projectName": "PN-2"

Предположим, что в этой коллекции будут сотни детей , Кроме того, идентификатор является случайным и неизвестным до времени выполнения запроса. Каждое пересечение имеет несколько других значений, как вы можете видеть на картинке.

Сначала я должен был перечислить все пересечения, чья клавиша начинается с заданного значения. Так, например, если я ищу «1», я хотел бы получить все пересечения в этом простом примере.

Этот фрагмент кода решает эту проблему. Хотя я до сих пор не уверен, что это лучший способ добиться этого.

firebase
  .database()
  .ref("crossing")
  .orderByKey()
  .startAt(self.searchedKey)
  .endAt(self.searchedKey + "\uf8ff")
  .once("value", function(snapshot) {
    if (snapshot.val()) {
      console.log(snapshot.val());
    }
  });

Моя главная проблема заключается в том, что теперь мне нужно перечислить все пересечения, чье значение projectName начинается с заданного значения.

Однако я не могу составить правильный запрос для этого. Я не могу использовать функцию .orderByChild () , поскольку дочерние ключи (идентификаторы) неизвестны.

Я не могу позволить себе запрашивать все пересечения из коллекции и перебирать все элементы на стороне внешнего интерфейса, поскольку позже этот объект будет огромным с большим количеством пересечений. Как я вижу, какой-то порядок все еще необходим.

1 Ответ

0 голосов
/ 23 марта 2020

База данных Firebase Realtime может упорядочивать / фильтровать только по одному значению от каждого дочернего узла. Это может быть либо ключ каждого узла (orderByKey()), либо его значение (orderByValue()), либо значение одного свойства на известном пути под каждым узлом (orderByChild("path/to/property")). Вы можете использовать любой из них, но только один из них для любого запроса.

Если вы хотите фильтровать по нескольким свойствам (как AND), часто можно объединить значения, по которым вы хотите фильтровать, в одиночное (syntheti c) свойство. Например, вы можете (также) добавить ключ каждого узла в свойстве и объединить его с именем проекта в: "projectName_key": "PN-1_ 1346", а затем упорядочить / отфильтровать это свойство.

Для более длинного примера этого и другие подходы, смотрите мой ответ здесь: Запрос, основанный на нескольких выражениях where в Firebase

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...