在Spring MongoDB组中按一列并得到另外两个字段的总和

时间:2015-10-09 13:32:57

标签: spring mongodb

我有一个包含示例数据的Feed集合,如:

{
"_id" : ObjectId("55deb33dcb9be727e8356289"),
"userName" : "John",
"likeCount" : 2,
"commentCount" : 10,
}
,
{
"_id" : ObjectId("55deb33dcb3456e33434d456"),
"channelName" : "Mark",
"likeCount" : 5,
"commentCount" : 10,
},
{
"_id" : ObjectId("55acd3434324acd3e4567567"),
"userName" : "John",
"likeCount" : 12,
"commentCount" : 15,
}

我想通过“userName”和“likeCount”+“commentCout”的总和得到所有记录。  在Mysql中我们使用:

select userName,sum(likeCount)+sum(commentCount) as "totalCount"  from feed group by userName

如何为上述查询编写聚合?

1 个答案:

答案 0 :(得分:1)

我相信这可以通过在 $project 阶段添加likeCountcommentCount字段的额外字段来实现,然后执行总和操作在该字段上,按userName键分组的文档。在mongo查询中有类似的东西:

db.feed.aggregate([
    {
        "$project": {
            "userName": 1,
            "sumLikeAndCommentCounts": {
                "$add": [ "$likeCount", "$commentCount" ]
            }
        }
    },
    {
        "$group": {
            "_id": "$userName",
            "totalCount": {
                "$sum": "$sumLikeAndCommentCounts"
            }
        }
    }
])

您只需要一个管道步骤 $group ,您可以在其中插入添加操作作为 $sum 的表达式:

db.feed.aggregate([    
    {
        "$group": {
            "_id": "$userName",
            "totalCount": {
                "$sum": {
                    "$add": [ "$likeCount", "$commentCount" ]
                }
            }
        }
    }
])

上述两个操作管道都将产生结果(对于给定的样本数据):

{ "_id" : null, "totalCount" : 15 }
{ "_id" : "John", "totalCount" : 39 }

Spring Data MongoDB聚合等效基于第一个示例,可以选择在投影操作中使用SpEL andExpression

Aggregation agg = Aggregation.newAggregation( 
    project("id", "userName") 
        .and("likeCount").plus("commentCount").as("sumLikeAndCommentCounts"),
        //.andExpression("likeCount + commentCount").as("sumLikeAndCommentCounts"), <-- or use expressions
    group("userName").sum("sumLikeAndCommentCounts").as("totalCount")
); 
AggregationResults<FeedsTotal> result = 
mongos.aggregate(agg, this.getCollectionName(), FeedsTotal.class);