Google Cloud Datastore:如何查询所有不同的Parent/Ancestor?

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不支持分组依据

Dan*_*scu 7

您应该注意,数据存储区的祖先不是在实体种类级别建立的:您不能真正说这种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.