0

比方說,我有一個模型:NDB查詢與投影在()中.IN使用的屬性

class Pet(ndb.Model): 
    age = ndb.IntegerProperty(indexed=False) 
    name = ndb.StringProperty(indexed=True) 
    owner = ndb.KeyProperty(indexed=True) 

而且我有一個名爲owners鍵的列表。要爲Pet就做一個查詢,我會做:

pets = Pets.query(Pets.owner.IN(owners)).fetch() 

的問題是,該查詢返回整個實體。

我該如何做一個預計的查詢並獲取所有者和名稱?

或者我應該如何構造數據來獲取名稱和所有者。

我可以做一個name的預測,但我鬆了從寵物的所有者的參考。 owner不能在投影中。

+0

它總是由設計 – voscausa

+0

返回整個實體(對象)請澄清你的問題對我來說,因爲如果你有keys.You的名單可以調用' (key).get()'並且它將帶出你將選擇你想要的propery的'entity'。同時通過密鑰獲取實體在應用引擎中是免費的! – Xenolion

回答

0

正如你已經注意到了,你不能做到這一點與你提到的具體情況下,因爲你打Limitations on projections之一:

  • 屬性在平等引用(=)或會員( IN)濾波器無法投射。

由於ownerIN濾波器它不能投影被使用。既然你需要owner,你不能投影它,你將不得不放棄投影,因此你將永遠得到整個實體。

一種選擇將是你的實體總是分裂成2個等實體,變成了1:1的關係,使用相同的實體ID:

class PetA(ndb.Model): 
    name = ndb.StringProperty(indexed=True) 
    owner = ndb.KeyProperty(indexed=True) 

class PetB(ndb.Model): 
    age = ndb.IntegerProperty(indexed=False) 

這樣你就可以做同樣的查詢,除了在PetA而不是原來的Pet,結果你會得到相當於你正在尋找的原始投影查詢。

不幸的是,這隻適用於同一個實體的一個或幾個這樣的投影查詢,否則你需要將實體拆分成太多塊。所以你可能不得不妥協。

您可以找到有關實體的分裂更細節re-using an entity's ID for other entities of different kinds - sane idea?

+0

嗯,有趣的想法。謝謝。但是如果寵物只包含我需要的數據,你會說只索引「所有者」是一個好主意?這個名字沒有必要,對嗎?沒有查詢名稱 –

+0

僅當您想要按「name」過濾或排序查詢結果時,才需要索引'name'。 –