2013-03-07 7 views
1

У меня есть типичное веб-приложение, в котором я пытаюсь создать грани из коллекции mongodb. В настоящее время это выполняется с использованием структуры агрегации с использованием драйвера Java (v2.10.1). Грани генерируются правильно, за исключением документов, содержащих подмассивов, за исключением, например, У меня есть следующие JSON документов:Агрегация Mongodb на Json Array (JAVA)

  1. {name: polo, fueltypes:[benzin, lpg], color: black}
  2. {name: golf, fueltypes:[benzin, cng], color: blue}
  3. {name: a4, fueltypes:[diesel], color: blue}

Возвращаемый набор результатов :

имя:

{_id: polo, count: 1} 
{_id: golf, count: 1} 
{_id: a4, count: 1} 

цвет:

{_id: black, count: 1} 
{_id: blue, count: 2} 

fueltypes:

{_id: [benzin,lpg,cng,diesel], count: 3} 

Суммарный результат поля fueltypes содержит все поля массива.

Однако желаемый результат должен быть:

fueltypes:

{_id: benzin, count: 2} 
{_id: lpg, count: 1}  
{_id: diesel, count: 1}  
{_id: cng, count: 1}  

и соответствующий код Java:

String str = "name" ; //or fueltypes, color 
// create match 
BasicDBObject match = new BasicDBObject(); 
match.put("$match", new BasicDBObject()); 

// build the $projection operation 
DBObject fields = new BasicDBObject(); 

// fields.put("count", 1); 
DBObject project = new BasicDBObject(); 

// Now the $group operation 
DBObject groupFields = new BasicDBObject(); 

DBObject unwindFields = new BasicDBObject(); 
// build the $projection operation 
fields.put(str, 1); 
project.put("$project", fields); 

// Now the $group operation 
groupFields.put("_id", "$" + str); 

// performing sum and storing it in the count attribute 
groupFields.put("count", new BasicDBObject("$sum", 1)); 

DBObject group = new BasicDBObject("$group", groupFields); 
AggregationOutput output = serviceCollection.aggregate(match, project, group); 

ответ

0

Группировка по массиве "fueltypes" дает число вхождений массива как такового.

Подсчитать это элементы по отдельности, вы должны использовать оператор $ разматывания, например, так:

// create unwind 
BasicDBObject unwind = new BasicDBObject(); 
unwind.put("$unwind", "$" + str); 

и включить это перед оператором $ группы. В качестве альтернативы вы можете вызвать $ unwind только в том случае, если str является «топливом».

Для получения дополнительной информации об отдыхе см. http://docs.mongodb.org/manual/reference/aggregation/