2012-04-05 67 views
0

我有一個這樣定義的客觀化實體:爲什麼不按部分實體鍵過濾?

public class MyEntity1 
{ 
    @Id @Indexed String    phoneNumber; 
    @Parent @Indexed Key<MyEntity2> parentEntityKey; 
} 

當我試圖通過phoneNumber的篩選,我收到以下錯誤信息:

Cannot (yet) filter by @Id fields on entities which have @Parent fields. 

這樣做的原因建設,我想當我知道phoneNumber和parentEntityKey時,我有時可以得到(而不是查詢)這些記錄。在其他一些情況下,我只知道phoneNumber並希望查詢它。

這是Objectify或Datastore的缺點,我可以找到解決辦法嗎?你有一個解決我的兩個要求的提案(當我知道這兩個值時通過phoneNumber查詢,而不知道什麼時候獲得查詢)?

回答

2

這是數據存儲鍵的性質。

您無法通過密鑰的ID部分進行過濾。您可以按整個鍵過濾,也可以使用祖先()查詢按鍵層次進行「過濾」,但不能僅通過鍵的@Id部分進行過濾。想想密鑰如何在BigTable的佈局:

/parentkind1/parentid1/parentkind2/parentid2/kind/id 

你不能這樣做範圍掃描上只是ID部分。

這聽起來像你想要做的是在你的實體上創建索引phoneNumber屬性,獨立於@Id字段。是的,它是重複的數據,但不管什麼都需要單獨的索引,所以將序列化到blob的額外數據可以忽略不計。

請注意,您無法查詢事務內部的索引屬性,並且查詢將具有最終的一致性行爲。如果您需要分配唯一的電話號碼,則需要創建一個不帶@Parent的單獨PhoneNumber實體,其@ @d是電話號碼本身。 XG交易使您可以創建此唯一性實體,並通過單一的一致操作將其與MyEntity1相關聯。