Firestore составной индекс перестановки взрыв? - PullRequest
3 голосов
/ 03 апреля 2019

Я планирую перенести базу данных из 30 коллекций, ~ 750 тыс. Документов из Монго в Google Firestore; но у меня проблемы с составными индексами.

Есть 12 полей, которые мне нужно иметь возможность запрашивать ad-hoc (т. Е. Field1 = A и Field7 = B и Field9 = C) - насколько я вижу, мне нужен составной индекс для каждой комбинации (?)

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

Я неправильно понимаю индексы или эти запросы просто невозможны в Firestore?

1 Ответ

1 голос
/ 12 апреля 2019

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

Field1 = A и Field2 = A

или

Field1 = A и Field2 = B и Field7 = D

, так как общее количество составных индексов равно 200, если вы пытаетесь создать составные индексы с каждымкомбинация в.

Тем не менее, мои первоначальные тесты показывают, что вы можете сделать следующее.

Создать составной индекс с полями от 1 до 9.

Это будет использоваться для удовлетворения всехпоиски, содержащие эти поля (если у вас нет других полей в списке предложений .where).

Вы также должны соответствовать критериям DESCENDING OR ASCENDING, если вы также используете order_by, но так каквы смотрите на точное совпадение, это не должно иметь значения.

Это работает, потому что firestore разумно использует составные индексы и ищет индекс, в котором есть все поля и тот факт, что в нем большеЭто не имеет значения, поскольку в предложении .where не указывается какой-либо конкретный порядок для этих полей, и, следовательно, можно использовать существующий индекс.

Если вы ищете слияние Индекса (близко к основанию), это объясняется.

https://firebase.google.com/docs/firestore/query-data/index-overview

Что касается программного создания и удаления индексов, то теперь это стало более возможным, чем в конце прошлого года.

Можно выгружать существующие составные индексы вфайл, использующий инструмент firebase https://firebase.google.com/docs/cli/

Если вы выполните инициализацию firebase и выберете индексы и правила firestore, то в результате в текущей папке / каталоге будет создан файл с именем firestore.indexes.json, которыйвключает в себя все составные индексы пожарного магазина, а также все исключения.Я бы порекомендовал сделать резервную копию этого файла, так как он может быть использован для воссоздания индексов, если вы что-то напутали.

Этот файл можно добавить, а затем команду

firebase deploy --only firestore: indexes

добавит все составные индексы в файл (будут созданы новые и их можно будет увидеть в консоли Firebase на вкладке индексы).Существующие не будут затронуты.

Это не меняет ограничения в 200 составных индексов.Существует также ограничение в 100 полей в списке предложений .where, включая поля order_by.

Вы также можете удалять индексы с помощью gcloud SDK.Для получения инструкций обратитесь к следующей странице.

https://cloud.google.com/sdk/install

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

Этохорошее начало для изучения параметров gcloud

https://cloud.google.com/sdk/gcloud/reference/

На следующей странице описано, как создать индекс.

https://cloud.google.com/sdk/gcloud/reference/beta/firestore/indexes/composite/create

КакНапример,

 gcloud beta firestore indexes composite create \
      --collection-group=Events \
      --field-config field-path=tags,array-config=contains \
      --field-config field-path=user_id,order=descending \
      --field-config field-path=timestamp,order=descending

См. ссылку для дополнительных флагов, которые можно использовать.

Просто имейте в виду, что выполнение этой команды заблокирует командную строку до завершения создания индекса, и это может занять5 или 10 минут или даже дольше.Если вам нужно добавить много индексов, было бы неплохо запустить их в качестве фоновой команды для каждой из них, чтобы не выполнять однопоточную обработку 100 команд создания индекса.

gcloud может бытьиспользуется для создания составных индексов, а также для удаления составных индексов, хотя их можно удалить только по идентификатору.

Это можно найти с помощью команды

gcloud beta составной список бета-версий индексов

+--------------+---------------------+-------------+-------+------------------------------+------------+--------------+
|     NAME     |   COLLECTION_GROUP  | QUERY_SCOPE | STATE |         FIELD_PATHS          |   ORDER    | ARRAY_CONFIG |
+--------------+---------------------+-------------+-------+------------------------------+------------+--------------+
| CICAgJjUt4gK | MyCollection        | COLLECTION  | READY | fieldStatus                  | ASCENDING  |              |
|              |                     |             |       | lastupdatedTimestamp         | DESCENDING |              |

Чтобы просто получить значение имени, выполните следующую команду

Составной список бета-версий индексов бета-версии gcloud --format = "value (name)" --filter = "FIELD_PATHS: Field1"

Это предоставит список составных имен индексов, которые затем можно будет использовать для подачи в команду удаления, где индекс включает имя поля «Field1».

Удаление можно выполнить с помощью имени(CICAgJjUt4gK в этом примере), перечисленный вышеупомянутой командой, используя следующую команду удаления

gcloud -q --account=by@email.address --project = proj-a73464 бета-версии индексов брандмауэра композитное удаление CICAgJjUt4gK

где --account - адрес электронной почты, зарегистрированный для проекта firebase, и --project name - это имя вашего проекта, а -q означает «тихий».Эти параметры ДОЛЖНЫ быть в начале команды.

Индексы удаляются намного быстрее, чем они создаются, поэтому, если вы продолжаете обновлять представление составного индекса консоли firestore, вы должны увидеть, что счетчик идет вниз.

Для создания индексов используйте

композитный индекс бета-версии gcloud firestore create --collection-group = COLLECTION_GROUP --field-config = FIELD_CONFIG [--async] [GCLOUD_WIDE_FLAG…]

для создания.Найдите параметры этой команды, но они будут аналогичны команде delete.

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