4.4MongoDB的Aggregation

MongoDB被定义为最接近于关系数据库的NOSQL数据库,是有原因的,因为MongoDB还可以进行大量的Aggregation统计,比如

  • $project - 可以从子文档中提取字段,可以重命名字段。
  • $match - 可以实现查找的功能。
  • $limit - 接受一个数字n,返回结果集中的前n个文档。
  • $skip - 接受一个数字n,丢弃结果集中的前n个文档。
  • $group - 统计操作, 还提供了一系列子命令。
  • $avg, $sum 等等函数…。
  • $sort - 排序。

这一块的语法和Mysql非常相似,比如统计下每个用户发过多少篇文章,mysql的统计sql如下:

select author, count(*) as count from article_info as article group by author having count > 0

原生MongoDB脚本如下:

db.article_info.aggregate([
    {
        "$group": {
            "_id": "$author",
            "count": {
                "$sum": 1
            },
            "name": {
                "$first": "$author"
            }
        }
    },
    {
        "$project": {
            "name": 1,
            "count": 1,
            "_id": 0
        }
    },
    {
        "$match": {
            "count": {
                "$gt": 0
            }
        }
    }
]);

麻烦一些!

$group:根据author分组,然后统计次数,用$sum函数,显示第一个名称
$project:定义要显示的key,1为显示,0为不显示
$match:过滤掉没发过文章的用户,次数大于0

spring-data-mongodb实现分组统计

定义统计结果ArticleResult.java

public class ArticleResult {
    private String name;
    private Integer count;
// get set 省略
}

测试方法

@Test
    public void testAggregation() {
        Aggregation agg = newAggregation(
                group("author").count().as("count").first("author").as("name"),
                project("name", "count"),
                sort(Sort.Direction.DESC, "count"),
                match(Criteria.where("count").gt(0))
        );
        AggregationResults results = mongoTemplate.aggregate(agg, "article_info", ArticleResult.class);
        List tagCount = results.getMappedResults();
        for (ArticleResult studentResult : tagCount) {
            System.out.println(studentResult.getName() + "\t" + studentResult.getCount());
        }
    }

这里面采用了newAggregation这个对象,定义了按照group方法,project映射名称
sort排序字段,match结果匹配字段

总的来讲还是比较简单的。

源码下载

本工程详细源码

你可能感兴趣的:(4.4MongoDB的Aggregation)