【问题标题】:Google Cloud Datastore: how to query all distinct Parent/Ancestor?Google Cloud Datastore:如何查询所有不同的父/祖先?
【发布时间】:2018-05-18 07:15:41
【问题描述】:

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

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

SELECT DISTINCT User FROM Order

查询的响应是:

没有实体匹配此查询。

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

由于parent也是key的一部分,我也试过了:

SELECT DISTINCT __key__ FROM Order

但是错误响应说:

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

【问题讨论】:

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


    【解决方案1】:

    您应该注意,数据存储祖先不是在实体kind 级别建立的:您不能真的说Order kindUser 种类作为祖先。

    祖先是在 entity 级别建立的 - 只有在实体创建级别指定了一个祖先时,一个实体才具有祖先,否则它没有祖先。同样不管祖先实体是什么种类,相同种类的不同实体可以有不同种类的祖先或根本没有祖先。

    考虑到这一点,听起来您的每个 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)

    我将向User 种类添加一个order_count 属性,向Order 种类添加一个user 键属性。每当创建订单时,我都会创建一个Order 实体,并将其user 属性设置为相应的User 实体键,并且我会增加该User 实体的order_count 属性。然后,要获得您想要的,您只需查询具有非零 order_countUser 实体。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-01-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多