2012-07-31 33 views
2

我有一个MongoDB集合,我需要在字段中找到每个不同的值,每个值的出现次数,有点像SQL中的GROUP BY和COUNT函数。Java中的MongoDB汇总框架

例如

Item name ------ count 

Soap ----------- 7 
Apples --------- 4 
Tin Foil ------- 5 

我是新来的MongoDB,并没有真正能够找到任何可以帮助我的文档。到目前为止,我已经能够返回一个不同值的列表,但不是每个列表的数量。

我需要通过Java MongoDB库来实现。

+0

你见过:http://www.mongodb.org/display/DOCS/Aggregation – beny23 2012-07-31 09:47:08

回答

1

可以使用count()distinct()simple aggregation,并通过MongoDB的Java驱动程序的DBCollection classgroup()命令。

对于当前生产版本的MongoDB(2.0.6)中的更高级查询,您可以通过MapReduceCommand class使用Map/Reduce

在MongoDB 2.2(目前正在测试版本)中,有一个新的Aggregation Framework功能。 Java驱动程序的2.9.0版本将包含一个aggregation helper

+1

聚集助手将在2.9.0版可用(不是1.9.0)。顺便说一句,你已经可以用Jongo使用新的Aggregation Framework:http://jongo.org/#querying – 2012-08-01 12:12:45

+0

@BenoitGuerout:Thx,off by 1 :-p。纠正。 2.9.0 Java驱动程序尚未正式发布,但可以使用gongub checkout [mongodb-java-driver](https://github.com/mongodb/mongo-java-driver)进行测试。 – Stennie 2012-08-01 12:14:21

+0

@BenoitGuerout:Jongo的语法看起来很整齐..不错的工作:) – Stennie 2012-08-01 12:20:00

2
db.item.aggregate([ 
{ 
    $group: { 
     _id: "$name", 
     count: { 
      "$sum": 1 
     } 
    } 
}, 
{ 
    $project: { 
     _id: 0, 
     name: "$_id", 
     count: 1 
    } 
} 
]).pretty(); 

的Java实现会是这样

final MongoClient mongoClient = new MongoClient(); 
    final DB db = mongoClient.getDB("DB_NAME"); 
    final DBCollection collection = db.getCollection("item"); 

    final DBObject groupIdFields = new BasicDBObject("_id", "$name"); 

    groupIdFields.put("count", new BasicDBObject("$sum", 1)); 
    final DBObject group = new BasicDBObject("$group", groupIdFields); 

    final DBObject projectFields = new BasicDBObject("_id", 0); 
    projectFields.put("name", "$_id"); 
    projectFields.put("count", 1); 
    final DBObject project = new BasicDBObject("$project", projectFields); 

    final AggregationOutput aggregate = collection.aggregate(group, project); 
+0

@cpburnz你是对的我只是试图把一个答案。现在我为它添加了java实现 – 2014-05-16 00:29:42