# #google-cloud-firestore
Вопрос:
Я пытаюсь реализовать логику для запроса коллекций людей для предложения имен на основе комбинации аргументов из 3 возможных ( name
, surname
, nick
), например:
people.where('name', '==', nameArg).where('surname', '>=', surnameArg).where('surname', '<=', surnameArg 'uf8ff')
или
people.where('nick', '==', nickArg).where('name', '>=', nameArg).where('name', '<=', nameArg 'uf8ff')
Идея состоит в том, что могут быть любые 1 или 2 поля, использующие ==
оператор, и одно с >=
/ <=
. Я получил ошибку 9 FAILED_PRECONDITION: The query requires an index.
, поэтому я создал индекс, используя все 3 поля. Но когда в моем запросе используются только 2 поля, я все равно получаю ту же ошибку.
Ожидается ли, что я создам 4 индекса для каждой комбинации параметров запроса? Это кажется таким неправильным.
Имеет ли значение также порядок полей в индексе?
Ответ №1:
Хотя в вашем проекте Firestore часто будет много индексов, вам может не понадобиться составной индекс для каждой комбинации полей. Ключевым моментом здесь является то, что Firestore может использовать индексы с одним полем для проверки равенства.
Из документации по использованию преимуществ объединения индексов:
Хотя Cloud Firestore использует индекс для каждого запроса, он не обязательно требует одного индекса для каждого запроса. Для запросов с несколькими предложениями equality (
==
) и, при необходимости, предложением OrderBy Cloud Firestore может повторно использовать существующие индексы. Cloud Firestore может объединять индексы для простых фильтров равенства, чтобы создавать составные индексы, необходимые для более крупных запросов на равенство.
Я должен признать, что я всегда немного борюсь с тем, как применить это в своих собственных проектах, но, например, в примере проекта FriendlyEats используется на удивление мало индексов для объема сортировки и фильтрации, которые он позволяет.
Комментарии:
1. Спасибо, то есть вы хотите сказать, что я должен просто создать индекс для каждого из полей? Правильно ли я понял?
2. Я в замешательстве, потому что из интерфейса docs и Firestore я делаю вывод, что индексы отдельных полей по умолчанию создаются автоматически. Но я действительно получаю эту ошибку, так что, похоже, это не работает таким образом?
3. Использование нескольких индексов с одним полем работает только для фильтров равенства . Для других типов фильтров и сортировки всегда требуется составной индекс в соответствующем поле, но вы можете добавить дополнительные проверки на равенство в свой запрос, не добавляя для них отдельные индексы.
4. Это означает, что использование фильтра неравномерности в сочетании с фильтрами равенства, в конце концов, требует индексов для всех возможных комбинаций полей равенства — неравномерности. И не только это — также все комбинации заказов! Я просто попытался запросить
surname-name
наличие и индексname-surname
, и он все равно выдает эту ошибку! 😮 Я действительно не понимаю, почему Firebase так популярна.