簡體   English   中英

Google Cloud Datastore:如何查詢所有不同的父/祖先?

[英]Google Cloud Datastore: how to query all distinct Parent/Ancestor?

我有一個名為Order的數據存儲種類,它有一個祖先/父User

我想使用GQL查詢訂單的所有不同祖先(用戶),但是以下查詢不起作用。

SELECT DISTINCT User FROM Order

查詢的響應是:

沒有實體符合此查詢。

確保要搜索的屬性有簡單索引或復合索引。 學到更多

由於父母也是鑰匙的一部分,所以我也嘗試了:

SELECT DISTINCT __key__ FROM Order

但是錯誤響應說:

GQL查詢錯誤:屬性: 不支持分組依據

您應該注意,數據存儲體系不是在實體種類級別建立的:您不能真正說出Order 種類具有User 種類作為祖先。

祖先是在實體級別建立的-僅當在實體創建級別指定一個祖先時,該實體才具有祖先,否則就沒有祖先。 同樣,祖先實體的種類也無關緊要,同一類型的不同實體可以具有不同種類的祖先,也可以根本沒有祖先。

考慮到這一點,聽起來每個Order實體都有一個User實體作為祖先。

祖先關系的存在將所有相關實體置於同一實體組中。 所有沒有血統的實體都被放置在各自的實體組中(它們是實體組的根/領導者)。

在您的情況下, Order實體放置在其各自的User實體的實體組中。

進行祖先查詢時(即指定了特定祖先或后代實體),查詢結果將僅限於該特定實體組的范圍。 這允許以事務方式進行此類查詢,並獲得非常一致的結果。

有關祖先查詢的語法示例,請參閱Google Cloud Datastore中的HAS ANCESTOR和HAS DESCENDANT子句

缺點是您無法進行跨越多個實體組的祖先查詢。 在您的情況下,您要查詢位於不同實體組中的User實體。 即使您將所有User實體放在同一組中(通過為它們指定一個共同的祖先鍵),也仍然無法獲得所需的內容,因為您要按Order查找不同的祖先。后代條件”- Order只能有一個User作為祖先。

這使我們發現了問題的根本原因:您正在使用實體祖先來建立實體關系模型。 這不是血統的目的,它是為實現高度一致性而設計的。 我知道,這聽起來令人困惑。

您可以做的就是忘記數據存儲的祖先,並使用無格式鍵屬性無限制地為您的關系建模。 另請參閱Google App Engine(Python)中的電子商務產品類別

我要為User類型添加一個order_count屬性,為Order類型添加一個user密鑰屬性。 每當創建Order我都會創建一個Order實體,並將其user屬性設置為相應的User實體鍵,然后增加該User實體的order_count屬性。 然后,要獲得所需的內容,只需要查詢具有非零order_count User實體。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM