Почему этот запрос пожарного магазина требует индекса? - PullRequest
0 голосов
/ 15 декабря 2018

У меня есть запрос с методом where() с оператором равенства, а затем с методом orderBy(), и я не могу понять, почему он требует индекса.Метод where проверяет значение в объекте (карте), а порядок по этому номеру.

В документации сказано:

Если у вас есть фильтр со сравнением диапазонов(<, <=,>,> =), ваш первый порядок должен быть в том же поле

Так что я бы подумал, что фильтр равенства будет в порядке.

Здесьмой код запроса

this.afs.collection('posts').ref
.where('tags.' + this.courseID,'==',true)
.orderBy("votes")
.limit(5)
.get().then(snap => {
  snap.forEach(doc => {
    console.log(doc.data());
  });
});

Вот пример структуры базы данных enter image description here

Спасибо за продвинутый

Ответы [ 2 ]

0 голосов
/ 15 декабря 2018

Индекс - это просто инвентарь базы данных (запись о том, где находится), и каждый индекс - это конкретный инвентарь конкретной вещи (свойства и его стоимость).Если бы инвентаризации не было, для выполнения запроса, где someProperty равно someValue, машине пришлось бы выполнять итерацию по всей коллекции, чтобы определить, какие документы имеют это свойство и это значение.Ведя инвентаризацию свойств (запись о том, какие свойства и какие значения содержатся в каких документах), когда вы выполняете запрос, машина направляется прямо в инвентарь, прежде чем перейти в коллекцию.Это работает только потому, что инвентарь (индекс) всегда упорядочен по значению - индекс никогда не может быть не в порядке.Поэтому, чтобы получить документы, значения которых находятся в диапазоне от x до y, аппарат просто должен найти первый документ в инвентаре в x и охватить до y и извлечь эти документы из коллекции.Машина даже не должна перебирать весь инвентарь.Отчасти это является причиной того, что запросы Firestore являются такими быстрыми, и почему размер коллекции не влияет на производительность запроса и почему вам нужно только индексировать свойства, которые необходимо запрашивать.

0 голосов
/ 15 декабря 2018

Почему для этого запроса в пожарном хранилище требуется индекс?

Как вы, наверное, заметили, запросы в Cloud Firestore выполняются очень быстро, и это потому, что Firestore автоматически создает индексы для любых ваших полей.в вашем документе.Поэтому, когда вы просто фильтруете сравнение диапазонов, Firestore автоматически создает необходимый индекс.Если вы также попытаетесь упорядочить результаты, потребуется другой индекс.Этот вид индекса не создается автоматически.Вы должны создать это самостоятельно.Это можно сделать, создав его вручную в консоли Firebase или в журналах вы увидите сообщение, которое звучит так:

FAILED_PRECONDITION: The query requires an index. You can create it here: ...

Вы можете просто нажать на эту ссылкуили скопируйте и вставьте URL-адрес в веб-браузер, и ваш индекс будет создан автоматически.

Таким образом, для Firestore требуется индекс, чтобы вы могли выполнять очень быстрые запросы.

...