2013-07-09 37 views
0

我有兩個相關的類:讓我們說找到CompositeFilterOperator GAE數據存儲實體的密鑰列表子集

  • 產品
  • 每個用戶對產品的最終喜歡的標誌(很多用戶可以標記一個產品爲最喜歡的)

當我需要的用戶子集執行過濾喜愛的產品,我覺得我自己有一個問題:對於

爲前沒有API充足:我想在用戶1,具有標籤「運動」和顏色「藍色」

我可以

  • 做CompositeFilter上的標籤和色彩標準的產品興田喜愛的產品進行搜索,然後遍歷所有產品(數千),以找到哪些在最愛的ID列表中!哇! :-)
  • 找到收藏夾的子集,並執行手動過濾(編程方式,離開數據存儲區API)的所有其他條件。 YESSSS!
  • 最後但並非最不重要的:在產品本身(最喜愛的列)中添加一個最喜愛的用戶標識列表,以便每次用戶將產品放入其收藏夾時,所有120個索引寫入都會被重寫。 COOOOL!

好吧我在作弊,有一個解決方案:我可以閱讀最喜歡的實體,然後在查詢中使用id大(id = x1或id = x2或...)發現自己超出查詢大小限制的風險。因此,我應該通過兩個實體處理分頁和間接光標以獲得讀取,以獲得非常簡單的要求...

Soooo是啊...想法?

最好的問候, Zied哈姆迪 http://1vu.fr

回答

1

您可以結合keyproperty filters。如果我理解你上面的數據,查詢將是:

Query q = new Query("Product"); 

// favourite product key filter (max 30 in listOfProductIDs because this is IN query) 
query.addFilter(Entity.KEY_RESERVED_PROPERTY, 
         Query.FilterOperator.IN, listOfProductIDs); 

// add the property filters 
query.addFilter("color", Query.FilterOperator.EQUAL, "blue"); 
query.addFilter("tag", Query.FilterOperator.EQUAL, "sport"); 
+0

喜彼得, 對不起,我沒有回頭的答案:與FilterOperator.IN的問題是,要求對每個製成IN的可能性(這就是爲什麼它被限制爲30)。 您正在描述解決方案(1.)我給了+(使用IN查詢,這在性能和資源消耗方面是不可接受的) –

相關問題