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

时间:2018-05-18 07:15:42

标签: google-cloud-platform google-cloud-datastore gql google-query-language gqlquery

我有一个名为Order的数据存储区,它有一个祖先/父User

我想使用GQL查询订单的所有不同祖先(用户),但以下查询不起作用。

SELECT DISTINCT User FROM Order

查询的回复是:

  

没有与此查询匹配的实体。

     

确保您要搜索的属性有简单或复合索引。了解更多

由于父母也是密钥的一部分,我也尝试过:

SELECT DISTINCT __key__ FROM Order

但错误回复说:

  

GQL查询错误:属性不支持分组依据:

1 个答案:

答案 0 :(得分:7)

您应该注意,数据存储区的祖先未在实体种类级别建立:您无法真正说明Order 种类一个User 作为祖先。

祖先是在实体级别建立的 - 只有在实体创建级别指定了一个祖先,实体才有祖先,否则它没有祖先。同样,祖先实体是什么类型并不重要,同一类型的不同实体可以拥有不同种类的祖先或根本没有祖先。

记住这一点,听起来您的每个Order实体都有一个User实体作为祖先。

祖先关系的存在将所有相关实体置于同一实体组中。所有没有祖先的实体都被置于他们自己的实体组中(他们是实体组的根/领导者)。

在您的情况下,Order个实体被放置在各自User实体的实体组中。

当进行祖先查询(即指定了特定的祖先或后代实体)时,查询结果将仅限于该特定实体组的范围。这允许以事务方式进行这样的查询,结果非常一致。

有关祖先查询语法的示例,请参阅HAS ANCESTOR and HAS DESCENDANT clauses in google cloud datastore

缺点是您无法跨越多个实体组进行祖先查询。在您的情况下,您要查询位于不同实体组中的User个实体。即使您将所有User个实体放在同一个群组中(通过为他们指定共同的祖先密钥),您仍然无法得到您想要的内容,因为您已经通过Order寻找不同的祖先,这是一个"后代条件" - Order只能有一个User作为祖先。

这使我们了解您的问题的根本原因:您正在使用实体祖先来建模实体关系。这不是祖先的设计目标,它的设计具有很强的一致性。我知道,这听起来令人困惑。

您可以做的是忘记数据存储区的祖先,并使用普通键属性来建模您的关系,没有任何限制。另请参阅E-commerce Product Categories in Google App Engine (Python)

我将order_count属性添加到User种类,将user密钥属性添加到Order类型。每当创建订单时,我都会创建一个Order实体,其user属性设置为相应的User实体密钥,并且我将order_count增加UserUser实体的属性。然后,为了获得您想要的内容,您只需查询order_count具有非零UPDATE jdtestbysentence."sparseSupplement" SET uuid = 2b22da9c-58a6-11e8-ae82-2d3e941502e8 WHERE a_uid = "1849" IF EXISTS的实体。