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
,