У меня есть приложение Google App Engine Go, которое использует Datastore. Я пытаюсь реализовать запрос, включающий неравенства для двух свойств. Я не могу заставить работать составной индекс.
Вот схема этого вида:
type LicenseKeyUsage struct {
First time.Time
Last time.Time
Count int
Days int
}
Вот фрагмент запроса (lastMin имеет значение времени, а d — целое число):
aggregationCountQuery := datastore.NewQuery("LicenseKeyUsage").
FilterField("Last", "> = ", lastMin).
FilterField("Days", "> = ", d).
NewAggregationQuery().
WithCount("active_count")
Вот мой index.yaml
, расположенный в том же каталоге, что и app.yaml
:
indexes:
- kind: LicenseKeyUsage
properties:
- name: Last
- name: Days
Я развертываю индексный файл с помощью команды gcloud app deploy index.yaml
, затем перехожу в консоль хранилища данных и жду, пока индекс будет готов, а затем обновляю объект, который должен быть проиндексирован.
В консоли индекс не показывает никаких объектов.
Если я попытаюсь выполнить запрос, я получаю следующую ошибку:
rpc error: code = FailedPrecondition desc = The query contains range and inequality filters on multiple fields, please refer to the documentation for index selection best practices: https://cloud.google.com/datastore/docs/multiple-range-fields. One possible index to serve the query is:
- kind: LicenseKeyUsage
properties:
- name: Days
- name: Last
Прежде всего, порядок свойств в рекомендуемом индексе не соответствует порядку моих фильтров полей в запросе. Я переключился на этот индекс, но все равно получаю ту же ошибку.
Есть идеи, что здесь не так?
@SandeepVokkareni Я только что попробовал, но результат тот же. Команда gcloud выполнена успешно, поэтому команда не выдает ответа об ошибке. Консоль индекса хранилища данных показывает, что индекс создан. Похоже, он просто не собирает никаких данных об объектах. Как только я начну добавлять объекты, в столбце «записи» в индексной консоли хранилища данных должно отображаться количество объектов, верно? Просто показывает "-".
@SandeepVokkareni Думаю, я обнаружил проблему. Я не использую базу данных по умолчанию. Когда я создаю индекс, он создается в базе данных по умолчанию. Я не могу найти в документации, как создать индекс в базе данных, отличной от базы данных по умолчанию. Знаете ли вы, как это делается или где это задокументировано?
Я обнаружил причину этой проблемы. Индекс создавался для базы данных по умолчанию, но запросы были нацелены на базу данных, отличную от базы данных по умолчанию.
Можете ли вы попробовать обновить интерфейс командной строки gcloud до последней версии и повторно развернуть его. Также обязательно используйте последнюю версию Gcloud CLI. Можете ли вы попробовать развернуть с флагом
--verbosity=debug
и поделиться результатом. Также обратите внимание на Document1 и Document2.