Запрос OrderByChild, equalTo и limitToFirst загружает всю базу данных

1

Я пытаюсь сделать региональное приложение словаря в firebase.

Структура структуры данных: структура данных

OrderByKey и limitToFirst запрос для правильной разбивки на страницы, он загружает только запрошенные данные. Пример кода ниже -

db.ref('dictionary')
  .orderByKey()
  .startAt(String(this.perpage * (this.page - 1) + 1))
  .limitToFirst(this.perpage)
  .once('value')
  .then((snapshot) => {
    vm.words = []
    snapshot.forEach(function (childSnapshot) {
      var childKey = childSnapshot.key
      var childData = childSnapshot.val()
      childData.id = childKey
      vm.words.push(childData)
    })
    vm.inProgress = false
  })

Но, когда я запрашиваю использование orderByChild('word').equalTo(search_query).limitToFirst(3), он извлекает все записи 176023 сразу (проверяется с помощью websocket). Пример кода ниже -

db.ref('dictionary')
  .orderByKey()
  .orderByChild('word')
  .equalTo(this.search + '')
  // .startAt(String(25 * (this.page - 1) + 1))
  .limitToFirst(3)
  .on('value', (snapshot) => {
    console.log(snapshot)
    snapshot.forEach(function (childSnapshot) {
      var childKey = childSnapshot.key
      var childData = childSnapshot.val()
      childData.id = childKey
      vm.words.push(childData)
    })
    vm.inProgress = false
  }, (error) => {
    console.log(error)
    vm.inProgress = false
  })
Теги:
firebase
firebase-realtime-database

1 ответ

0
Лучший ответ

Скорее всего, у вас нет указателя на word. Когда нет индекса, сервер отправляет клиенту все местоположение и затем фильтрует его. В этом случае вы также получите достаточно явное предупреждение в своей консоли JavaScript.

См. Раздел документации Firebase о том, как определить индексы.

  • 0
    Спасибо! работает.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню