Jia*_*Gao 1 gql gqlquery google-cloud-datastore google-cloud-platform google-query-language
我有一个名为Datastore Kind Order
,它有一个祖先/父级User
.
我想使用GQL查询订单的所有不同祖先(用户),但以下查询不起作用.
SELECT DISTINCT User FROM Order
查询的响应是:
没有实体匹配此查询.
确保您要搜索的属性有简单索引或复合索引.学到更多
由于父母也是关键的一部分,我也尝试过:
SELECT DISTINCT __key__ FROM Order
但错误回复说:
GQL查询错误:属性:key不支持分组依据
您应该注意,数据存储区的祖先不是在实体种类级别建立的:您不能真正说这种Order
类型有一种User
类型作为祖先.
祖先是在实体级别建立的- 只有在实体创建级别指定了一个祖先,实体才有祖先,否则它没有祖先.此外,祖先实体是什么类型并不重要,同一类型的不同实体可以拥有不同种类的祖先或根本没有祖先.
记住这个说明,听起来你的每个Order
实体都有一个User
实体作为祖先.
祖先关系的存在将所有相关实体置于同一实体组中.所有没有祖先的实体都被置于他们自己的实体组中(他们是实体组的根/领导者).
在您的情况下,Order
实体被放置在其各自User
实体的实体组中.
当进行祖先查询(即指定了特定的祖先或后代实体)时,查询结果将仅限于该特定实体组的范围.这允许以事务方式进行这样的查询,结果非常一致.
有关祖先查询语法的示例,请参阅Google云数据存储区中的HAS ANCESTOR和HAS DESCENDANT子句.
缺点是您无法创建跨越多个实体组的祖先查询.在您的情况下,您正在查询User
位于不同实体组中的实体.即使你将所有User
实体放在同一个组中(通过为它们指定一个共同的祖先键),你仍然无法得到你想要的东西,因为你正在寻找不同的祖先Order
,这是一个"后代条件" " - Order
只能有一个User
作为祖先.
这将我们带到问题的根本原因:您正在使用实体祖先来建模实体关系.这不是祖先的设计目标,它的设计是为了保持一致性.我知道,这听起来令人困惑.
您可以做的是忘记数据存储区的祖先,并使用普通键属性来建模您的关系,没有任何限制.另请参阅Google App Engine中的电子商务产品类别(Python)
我会添加一个order_count
属性和User
类型的user
关键属性Order
.每当创建订单时,我都会创建一个Order
实体,其user
属性设置为相应的User
实体键,并且我将增加该实体的order_count
属性User
.然后,为了得到你想要的东西,你只需要查询User
非零的实体order_count
.
归档时间: |
|
查看次数: |
982 次 |
最近记录: |