我正在使用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版本?
我之前想过这个,但认为这不是解决问题的最好方法,因为我应该始终保持计数。无论如何,现在我会与它合作,谢谢。 – 2010-10-27 07:46:00
当您正在开发GAE的bigtable(或许多其他nosql数据库)时,如果您需要高效的查询,您通常需要进行非规范化和预计算。否则,你最终不得不迭代大量的数据,这可能是也可能不是可以接受的。 – 2010-10-27 16:26:02