Как Firebase rtdb запрашивает диапазон строк, используя orderByKey, startAt, endAt? - PullRequest
0 голосов
/ 04 февраля 2020

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

this.db.object(`...irrelevent`).query
      .orderByKey().startAt(startVal).endAt(`${endVal}\uf8ff`).once('value').then(res => {
        if (res.val()) {
          // value returned
        }
      });

Структура области, которую я запрашиваю, выглядит следующим образом

Structure of Data

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

Когда startVal = "0015" и endVal = "0060", запрос не совсем работает, так как он возвращает {0000-0015: "a", 0015-0075: "-M-BCseCnboNM9zB3o5S"}. Насколько я понимаю, он не должен возвращать первое свойство объекта, но когда я делаю set startVal = "0795" и endVal = "0810", он возвращает:

{0000-0015: "a"
0015-0075: "-M-BCseCnboNM9zB3o5S"
0150-0240: "-M-BCxH9URUtYQg06wXE"
0300-0360: "-M-BD-YIAXO2FMVac0PW"}

Это не кажется мне правильным, так как должно возвращаться ничего, потому что нет никаких данных между строками, которые startAt "0795" и endAt "0810".

Моя цель состоит в том, чтобы иметь возможность передать startVal, такой как "0000", и endVal, такой как "0030", и он возвращает

{0000-0015: "a"
0015-0075: "-M-BCseCnboNM9zB3o5S"}

Может кто-то прямо изложить мое понимание того, как работают запросы startAt и endAt при запросе диапазона строк?

1 Ответ

1 голос
/ 04 февраля 2020

Я думаю, вы видите какое-то принуждение к массиву.

Я тестировал с этим JSON:

{
  "0000-0015": "a",
  "0015-0075": "-M-BCseCnboNM9zB3o5S",
  "0150-0240": "-M-BCxH9URUtYQg06wXE",
  "0300-0360": "-M-BD-YIAXO2FMVac0PW",
  "key-0000-0015": "a",
  "key-0015-0075": "-M-BCseCnboNM9zB3o5S",
  "key-0150-0240": "-M-BCxH9URUtYQg06wXE",
  "key-0300-0360": "-M-BD-YIAXO2FMVac0PW",
}

И этот код:

function query(start, end) {
  ref.orderByKey().startAt(start).endAt(end)
  .once('value').then(snapshot => {
    console.log(`startAt("${start}").endAt("${end}"): ${snapshot.numChildren()} result(s)`)
    snapshot.forEach((child) => {
      console.log(`"${child.key}"`)
    });
  });
}

query("0000", "0015");
query("0000-", "0015~");
query("0015-", "0060~");
query("key-0000", "key-0015");

И полученный результат был:

startAt("0000").endAt("0015"): 0 result(s)
startAt("0000-").endAt("0015~"): 2 result(s)
  "0000-0015"
  "0015-0075"
startAt("0015-").endAt("0060~"): 1 result(s)
  "0015-0075"
startAt("key-0000").endAt("key-0015"): 1 result(s)
  "key-0000-0015"

Все, кроме первого результата, выглядят корректно, поэтому я думаю, что числа каким-то образом конвертируются (не дополняются) индексами массива (поэтому 0 вместо "0000"), что затем не работает.

Я бы рекомендовал всегда ставить префикс цифр c со строкой alphanumeri c, чтобы избежать такого поведения, как я делал с префиксом key- выше.

Для моего полного стенд, см .: https://jsbin.com/roluhip/2/edit?js, консоль

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