2016-05-23 2 views
2

У меня есть следующие данные:Монго: Как подсчитать агрегирования групп с помощью MongoTemplate Явы

{groupId: 1, name: Jon}, 
{groupId: 1, name: Dan}, 
{groupId: 2, name: Jon}, 
{groupId: 2, name: Ris}, 
{groupId: 3, name: David} 

я получаю в качестве входного массива GroupID, и я хочу, чтобы подсчитать количество имен окрености в общей сложности для тех, группы, я определил код агрегирования следующим образом:

groupIds [] = {1,2} 

    Aggregation agg = newAggregation(
      match(Criteria.where("groupId").in((groupIds)), 
      group("name").count().as("total") 
    ); 

, но я получаю groupResult, содержащий счетчик для каждого имени, то есть:

{name : Jon, total : 2} 
{name : Dan, total : 1} 
{name: Ris, total : 1} 

в то время как я на самом деле хочу, чтобы получить общее количество, которое = (который на самом деле размер выше groupResult)

как мне нужно настроить мою агрегацию для достижения этой цели?

Спасибо!

p.s. Дэвид игнорируется от графа - как задумано

ответ

1

Чтобы получить размер последней группы, вы можете ввести другой заключительный этап $group трубопровода, где вы можете использовать null группы ключа сгруппировать все документы, а затем вычислить накопленная сумма.

В Монго оболочки, это будет перевести на

db.collection.aggregate([ 
    { "$match": { "groupId": { "$in": [1, 2] } } }, 
    { 
     "$group": { 
      "_id": "$name"    
     } 
    }, 
    { 
     "$group": { 
      "_id": null, 
      "total": { "$sum": 1 } 
     } 
    } 
]) 

С Spring Data, это должно следовать:

Aggregation agg = newAggregation(
    match(Criteria.where("groupId").in((groupIds)), 
    group("name"), 
    group().count().as("total") 
); 
+0

это было именно то, что мне было нужно! благодаря! – shemerk