2010-10-26 54 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

相关问题