2012-02-16 91 views
0

因此,我将我的一些代码从SQL移动到mongodb,并且有几件事情对我来说还不是很清楚。什么是总和和排序mongodb查询的最佳途径

比方说,我有以下简单的SQL查询(只是一个例子)

select count(a.id) as count, b_id 
     from table group by b_id 
     where c_id=[SOME ID] 
     group by b_id 
     order by count desc; 

我认为每个人都明白是什么一样。

现在用mongo我可以使用多种方法,在mongo端执行所有操作,获取总结的结果并对客户端进行排序,或者仅将原始数据提交给客户端,然后执行所有处理。

对于上面的查询,最好的办法是用一些内部的mongodb机制(mapreduce等)在数据库中完成所有操作,或者将集合提取到客户端并在那里处理。通常数据集将会很大,但如果需要的话,查询可以分成几个部分。

客户端是基于Java的,如果重要的话。

回答

2

随着即将到来的MongoDB Aggregation Framework它是很容易做你需要做的。它已经在2.1.x开发版本中提供。

如果您坚持2.0或更低版本,则必须查看您提及的选项或架构更改,以避免首先在现场聚合中执行操作。例如,在NoSQL中,在源数据被操纵时,通过聚合数据来维护字段或文档是很常见的。最常见的例子是维持一个数组的大小作为一个字段:

update({..}, {$push:{array:element}, $inc:{elementCount:1}) 
+0

我不生产(还),所以我可以使用,在您看来是汇聚框架的情况下始终表现最好的方法以上? – mikkom 2012-02-16 12:26:43

+0

除了手动管理汇总数据(这是非常情景化的)是的。 AF是完全原生的,而组和m/r是JavaScript供电的,因此单线程和(相对)慢。坦率地说,如果你想m/r我会与Hadoop集成,而不是使用MongoDB m/r – 2012-02-16 12:30:01

+0

谢谢,我想我将不得不安装最新的unstable。 – mikkom 2012-02-16 12:33:34

1

您可以使用Map/Reduce对mongo端的数据进行分组,然后在客户端或mongo端进行排序。您还可以找到地图/减少示例here.