2017-02-09 11 views
0

Предполагая, что у меня есть эти документы:Как мы можем подсчитать количество элементов в arraylist из разных документов в mongodb java?

{ "_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: "$" цвета, count: {$ 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" } 

Следующим шагом является $group данные о color во время использования $sum сосчитать цветам

Окончательный вывод

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

Java Update:

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, но до сих пор не знаю. –