2013-10-18 29 views
0

我想知道爲什麼你需要在投影查詢中包含某些屬性。我試圖得到一個明確的'foo'屬性列表。爲什麼在過濾器中使用NDB屬性需要包含在投影查詢中?

Object.query(projection=[Object.foo], distinct=True) \ 
    .filter(Object.username == user.nickname()) \ 
    .filter(Object.bar >= value) \ 
    .fetch() 

即使建議的索引已啓動並正在運行,本文也會給出NeedIndexError。原因是基於bar> = value的第二個過濾器。通過刪除該過濾器,查詢工作完美,但沒有達到目標。

Object.query(projection=[Object.foo, Object.bar], distinct=True) \ 
    .filter(Object.username == user.nickname()) \ 
    .filter(Object.bar >= value) \ 
    .fetch() 

這一個工程,但現在你沒有一個結果只有獨特的foos,但foo和酒吧的carthesian產品。首先,這不是我們的目標。

Object.query() \ 
    .filter(Object.username == user.nickname()) \ 
    .filter(Object.bar >= value) \ 
    .fetch(projection=[Object.foo]) 

這一個也可以,但是沒有辦法按「富」,從而導致重複的「foo'值的列表。

這個問題的解決方案,你可以看到上面,但都導致更大的響應列表。如果可能,我想避免這種情況。因此,我有兩個問題:

  1. 爲什麼filter()中的屬性有時需要包含在投影中?這對我沒有意義。另外,爲什麼這會導致NeedIndexError而不是更合適的?
  2. 有沒有解決方案沒有上述缺點?或者,也許我從錯誤的方面解決這個問題?任何建議是受歡迎的。

回答

0

這是索引推薦系統的一個錯誤,應該在1.8.6版本的App Engine中修復。問題是,爲了提供不同的屬性,這些屬性必須按排序順序排列。請注意,不平等也必須按排序順序排列。所以如果你有不平等和明確的預測,他們必須在同一個屬性上。

投影必須在過濾器中的唯一原因是因爲您要求不同的屬性。你可以真正把這看作是在同一個屬性上對一個組進行投影。爲了執行此分組,必須對這些屬性進行排序以提供高效的重複數據刪除。

執行所需查詢的唯一方法是在內存中執行一些操作(正如您在問題中提到的那樣)。另一種選擇是不具有不等式過濾器,然後在內存中執行此過濾。

如果您升級到1.8.6 SDK,您應該開始獲得更好的(-ish)錯誤消息。

相關問題