我有一个名为Order
的数据存储区,它有一个祖先/父User
。
我想使用GQL查询订单的所有不同祖先(用户),但以下查询不起作用。
SELECT DISTINCT User FROM Order
查询的回复是:
没有与此查询匹配的实体。
确保您要搜索的属性有简单或复合索引。了解更多
由于父母也是密钥的一部分,我也尝试过:
SELECT DISTINCT __key__ FROM Order
但错误回复说:
GQL查询错误:属性不支持分组依据:键
答案 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
增加User
该User
实体的属性。然后,为了获得您想要的内容,您只需查询order_count
具有非零UPDATE jdtestbysentence."sparseSupplement" SET uuid = 2b22da9c-58a6-11e8-ae82-2d3e941502e8 WHERE a_uid = "1849" IF EXISTS
的实体。