2012-10-19 47 views
1

我想使用ndb.get_multi(list_of_keys)來避免進行更昂貴的查詢。如果我的理解是正確的,那麼ndb.get_multi()只會向您返回1個讀取的實體,因此如果您有50個密鑰的列表,並且只找到20個密鑰,那麼您只應收取20次讀取費用。ndb.get_multi()返回空實體

 keys = list() 

     keys.append(Key('User', 2)) // this user exists 
     keys.append(Key('User', 12)) // this user DOES NOT exist 
     keys.append(Key('User', 15)) // this user DOES NOT exist 

     users = ndb.get_multi(keys) 

我回來的是3個項目,其中1個是用戶,2個是空值。當我檢查AppStats時,我發現確實收取了我放入的所有密鑰,儘管2個密鑰不存在。

爲什麼我會返回空實體?不應該找不到的項目被跳過?

+0

看着你的另一個問題和這個問題,你正在吠叫錯誤的樹。您將不得不爲每個返回的實體付費。查詢非常有效。如果它沒有做你想做的事,你需要考慮替代方案,比如使用投影查詢或者某種緩存,比如memcache,邊緣緩存或者在其他實體中存儲非規範化數據。 – dragonx

回答

2

你要能夠做到

obj1, obj2, obj3 = ndb.get_multi([key1, key2, key3]) 

如果返回的結果數是任意長度的,元組拆包中斷,然後你必須得到一個清單,並檢查和鍵進行比較。這也是簡單刪除無在需要它使用filter

filter(None, list) 

的成本是每獲得/讀取(操作),這是不按返回的結果(數據)是相同的。無論是否存在,GAE中的內部服務和通信成本大致相同,但您不必爲不存在的項目進行反序列化cpu支付。

1

不,因爲現在您可以看到哪些項目找不到。

+0

但是,爲什麼我會爲沒有找到的實體收取費用? – Snowman

+2

您被收費,因爲您在尋找他們。該索引被搜索。 – voscausa

+0

數據存儲及其工具的好處在於,您可以真正瞭解底層操作(成本)以及可以優化的信息。這對於可擴展應用程序非常重要。在SQL環境中,查詢代碼是優化的,但不是查詢的成本。 – voscausa