您应该注意,数据存储祖先不是在实体kind 级别建立的:您不能真的说Order kind 有User 种类作为祖先。
祖先是在 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_count 的 User 实体。