2012-07-31 58 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