Firebase .OrderByChild () не работает для логических значений - PullRequest
0 голосов
/ 11 января 2019

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

orderByChild

При использовании orderByChild () данные, содержащие указанный дочерний ключ упорядочен следующим образом:

  1. Сначала идут дочерние элементы с нулевым значением для указанного дочернего ключа.

  2. Далее идут дочерние объекты со значением false для указанного дочернего ключа. Если несколько детей имеют значение false, они сортируются лексикографически по ключу.

  3. Дети со значением true для указанный дочерний ключ будет следующим. Если несколько детей имеют значение правда, они отсортированы лексикографически по ключу.

Ниже приведена структура JSON дерева, которое я использую

  "boolsTest" : {
    "node1" : {
      "truthValue" : true
    },
    "node2" : {
      "truthValue" : false
    },
    "node3" : {
      "truthValue" : true
    }
  }

Затем я запускаю запрос к дереву, как показано ниже

      await admin.database().ref(`boolsTest`).orderByChild("truthValue").once('value').then((value) =>{
          console.log("The values retuned by the query: " + JSON.stringify(value));
          return value;
  }).catch((error) => {
      console.log("The error returned: " + JSON.stringify(error));
      return error
  })
  })

Каковы результаты элементов дерева, возвращаемых неупорядоченными, в порядке

Значения, перенастроенные по запросу: {"node1": {"trueValue": true}, "node2": {"trueValue": false}, "node3": {"trueValue": true}}

Почему мои ценности не упорядочены и как это исправить? Спасибо.

1 Ответ

0 голосов
/ 11 января 2019

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

Результат, который вы получите из базы данных, содержит три вещи:

  1. Значение каждого соответствующего узла
  2. Ключ каждого соответствующего узла
  3. Порядок, в котором узлы находятся в результате

Когда вы вызываете .val() для снимка, он преобразует эти три фрагмента информации в объект JSON. И порядок ключей в объекте JSON не определен, поэтому при преобразовании теряется информация о порядке. Поэтому, когда вы обрабатываете весь результат как один большой объект JSON (как это делает ваш код), вы теряете информацию о заказе.

Чтобы предотвратить это, вы должны использовать Snapshot.forEach(), чтобы перебрать результаты:

await admin.database().ref(`boolsTest`).orderByChild("truthValue").once('value').then((snapshot) =>{
  snapshot.forEach((childSnapshot) => {
    console.log("Value retuned by the query: " + JSON.stringify(childSnapshot.val()));
  })
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...