Mongo:如何通过Java的MongoTemplate计算聚合组

时间:2016-05-23 14:54:02

标签: java mongodb aggregation-framework mongotemplate

我有以下数据:

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

我收到一个groupID数组作为输入,我想计算这些组的DISTICT名称总数,我定义了聚合代码如下:

    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}

虽然我实际上想得到总数= = strong> 3 (实际上是上述groupResult的大小)

如何调整聚合以实现这一目标?

谢谢!

P.S。大卫被忽略了 - 正如预期的那样

1 个答案:

答案 0 :(得分:1)

要获取最后一个组的大小,您可以引入另一个最终 $group 管道阶段,您可以按键使用null组对所有文档进行分组,然后计算累计和。

在mongo shell中,这将转换为

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")
);