2010-10-26 92 views
1

我正在使用Google App Engine(DataNucleus)的數據存儲。我有兩個班,一個聊天和一個評級。聊天可以被評爲更多,所以我創建了一個一對多的關係,添加一個列表到聊天類。App Engine數據存儲獲取多個父項的子項數

現在我想知道未評級聊天次數,所以我做了以下內容:

int numberOfChatsInStock = 0; 
for(Chat chat : chats){ 
    if(chat.getRatings().size() == 0){ 
    numberOfChatsInStock++; 
    } 
} 

它只是通過所有的聊天記錄,並檢查迭代如果收視率的數量爲0。

該解決方案有10次聊天時效果很好,但當我有500+聊天時,速度很糟糕(15秒+)。

我想也許size()方法更快。所以我嘗試Query.setFilter(「ratings.size()== 0」),但這給了我以下錯誤: 解析表達式時不支持的方法:InvokeExpression {[PrimaryExpression {ratings}]。size()}

有什麼方法可以提高速度嗎?

編輯 反應而DataNucleus將專家:

這是谷歌的插件,並且他們有責任爲它(而事實上,他們還沒有實現這個方法是他們的問題。我敢肯定,他們的數據存儲提供了一種獲取集合大小的方法)。他們的插件只使用DataNucleus 1.1,我們目前開發2.2,所以,你可以猜到,我們沒有太多時間用於GAE/J環境。

爲什麼谷歌使用1.1版本?

回答

0

您應該保持聊天模式的評級。然後,您可以運行查詢來選擇0評級的所有聊天。

+0

我之前想過這個,但認爲這不是解決問題的最好方法,因爲我應該始終保持計數。無論如何,現在我會與它合作,謝謝。 – 2010-10-27 07:46:00

+0

當您正在開發GAE的bigtable(或許多其他nosql數據庫)時,如果您需要高效的查詢,您通常需要進行非規範化和預計算。否則,你最終不得不迭代大量的數據,這可能是也可能不是可以接受的。 – 2010-10-27 16:26:02

相關問題