Google Cloud Datastore: как запросить информацию обо всех отличных родителях / предках?

У меня есть вид Datastore Kind Order, который имеет предка / родителя User,

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

SELECT DISTINCT User FROM Order

Ответ на запрос:

Ни один объект не соответствует этому запросу.

Убедитесь, что для свойств, которые вы ищете, есть простые или составные индексы. Учить больше

Поскольку родитель также является частью ключа, я также попытался:

SELECT DISTINCT __key__ FROM Order

Но ответ об ошибке сказал:

Ошибка GQL-запроса: Группировка по не поддерживается для свойства: ключ

1 ответ

Решение

Следует отметить, что происхождение хранилища данных не установлено на уровне вида сущности: вы не можете сказать, что Order вид имеет User добрый как предок.

Родословная устанавливается на уровне объекта - у объекта есть предок, только если он указан на уровне создания объекта, в противном случае у него его нет. Также не имеет значения, какого рода сущность предка, у разных сущностей одного и того же вида могут быть предки разных типов или вообще не иметь предков.

Имея это в виду, это звучит как каждый из ваших Order сущности имеют User сущность как предок.

Наличие родственных связей помещает все связанные сущности в одну группу сущностей. Все сущности без предков помещаются в свою собственную группу сущностей (они корни / лидеры групп сущностей).

В вашем случае Order сущности помещаются в группы сущностей их соответствующих User юридические лица.

Когда выполняется запрос предка (т. Е. Указывается либо конкретный предок, либо дочерний объект), результаты запроса будут ограничены только областью действия этой конкретной группы объектов. Это позволяет делать такие запросы транзакционным способом с строго согласованными результатами.

Пример синтаксиса для запроса предка см. В разделах HAS ANCESTOR и HAS DESCENDANT в облачном хранилище данных Google.

Недостатком является то, что вы не можете делать запросы предков, охватывающие несколько групп сущностей. В вашем случае вы запрашиваете User сущности, которые находятся в разных группах сущностей. Даже если бы вы разместили все User сущности в одной группе (указав для них общий ключ предка), вы все равно не сможете получить то, что хотите, так как вы ищете других предков с помощью Order, что является "условием потомка" - Order может иметь только один User как предок.

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

Что вы можете сделать, так это забыть о происхождении хранилища данных и использовать свойства простого ключа для моделирования ваших отношений без ограничений. См. Также категории продуктов для электронной коммерции в Google App Engine (Python).

Я бы добавил order_count собственность на User добрый и user ключевое свойство к Order Добрый. Всякий раз, когда создается заказ, я бы создал Order сущность со своим user свойство установлено на соответствующий User ключ сущности, и я бы увеличить order_count свойство этого User юридическое лицо. Затем, чтобы получить то, что вы хотите, вам просто нужно запросить User сущности, которые имеют ненулевой order_count,

Другие вопросы по тегам