2017-02-09 57 views
0

假设我有这些文件:我们如何计算mongodb java中不同文档中arraylist的项目数量?

{ "_id" : 1, "item" : "ABC1", "description" : "product 1", colors: [ "blue", "black", "red" ] } 
{ "_id" : 2, "item" : "ABC2", "description" : "product 2", colors: [ "blue", "purple" ] } 
{ "_id" : 3, "item" : "XYZ1", "description" : "product 3", colors: [ "red", "yellow"] } 

结果我想是

blue : 2 
red : 2 
black : 1 
purple : 1 
yellow : 1 

这可能使用MongoDB的执行或者我需要得到颜色数组中的Java后手动执行?提示或任何帮助将非常有用。

这是我如何得到数据库和集合

MongoClient mongoClient = new MongoClient("localhost", 27017); 
MongoCollection<Document> collection = mongoClient.getDatabase("tweets") 
      .getCollection("tweet"); 
+0

适用版本<= 3.2可以使用'db.collection.aggregate({$展开: “$颜色”},{$组:{_id: “$颜色”,计数:{$ sum:1}}}) ' – Veeram

+0

我使用的是3.2版本,但我是mongodb的新手,能否给我一个更清晰的解释@Veeram –

回答

2

你可以试试下面的聚集。

db.collection.aggregate({$unwind:"$colors"},{$group: { _id:"$colors",count:{$sum:1} }}) 

该查询将$unwind该数组。来自文档

解构输入文档中的数组字段以输出每个元素的 文档。

$unwind阶段后的响应。

{ "_id" : 1, "item" : "ABC1", "description" : "product 1", "colors" : "blue" } 
{ "_id" : 1, "item" : "ABC1", "description" : "product 1", "colors" : "black" } 
{ "_id" : 1, "item" : "ABC1", "description" : "product 1", "colors" : "red" } 
{ "_id" : 2, "item" : "ABC2", "description" : "product 2", "colors" : "blue" } 
{ "_id" : 2, "item" : "ABC2", "description" : "product 2", "colors" : "purple" } 
{ "_id" : 3, "item" : "XYZ1", "description" : "product 3", "colors" : "red" } 
{ "_id" : 3, "item" : "XYZ1", "description" : "product 3", "colors" : "yellow" } 

下一步是$groupcolor的数据,而使用$sum计数的颜色

最终输出

{ "_id" : "yellow", "count" : 1 } 
{ "_id" : "blue", "count" : 2 } 
{ "_id" : "black", "count" : 1 } 
{ "_id" : "red", "count" : 2 } 
{ "_id" : "purple", "count" : 1 } 

的Java更新:

3.x版

collection.aggregate(Arrays.asList(Aggregates.unwind("$colors"), Aggregates.group("$colors", Accumulators.sum("count", 1)))); 

2.x的版

collection.aggregate(Arrays.asList(new BasicDBObject("$unwind", "$colors"), new BasicDBObject("$group", new BasicDBObject("_id","$colors").append("count",new BasicDBObject("$sum", 1))))); 
+0

感谢您的解释。我确实明白在MongoDB中聚合是如何工作的。我无法适应java语法。 –

+0

Np。有什么麻烦?你能显示你的java代码吗? – Veeram

+0

我不知道我可以放置$ unwind和$ unwind。 我正在调查http://stackoverflow.com/questions/31643109/mongodb-aggregation-with-java-driver,但仍然没有线索 –