我有一个包含示例数据的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
如何为上述查询编写聚合?
答案 0 :(得分:1)
我相信这可以通过在 $project
阶段添加likeCount
和commentCount
字段的额外字段来实现,然后执行总和操作在该字段上,按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);