spring-data-mongodb之Aggregation
时间:2022-05-06
本文章向大家介绍spring-data-mongodb之Aggregation,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
这篇文章主要介绍下在data框架中如何使用Aggregation进行分组统计。
基本的操作包括:
- $project - 可以从子文档中提取字段,可以重命名字段。
- $match - 可以实现查找的功能。
- $limit - 接受一个数字n,返回结果集中的前n个文档。
- $skip - 接受一个数字n,丢弃结果集中的前n个文档。
- $group - 统计操作, 还提供了一系列子命令。
- $avg, $sum 等等函数…。
- $sort - 排序。
基于我们之前文章的数据我们就简单的统计下每个用户发过多少篇文章。 如果是用的mysql那么查询语句如下:
select article.author, count(*) as count from article_info as article group by article.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中我们要怎么去实现这个功能
Aggregation agg = newAggregation(
group("author").count().as("count").first("author").as("name"),
project("name","count"),
sort(Direction.DESC, "count"),
match(Criteria.where("count").gt(0))
);
AggregationResults<ArticleResult> results = mongoTemplate.aggregate(agg, "article_info", ArticleResult.class);
List<ArticleResult> tagCount = results.getMappedResults();
for (ArticleResult studentResult : tagCount) {
System.out.println(studentResult.getName() + "t" + studentResult.getCount());
}
按照原始的语句,用框架的语法拼出来就可以了
当然还有的小伙伴还是用习惯了java驱动的写法,也可以,就是没上面简洁
List<DBObject> pipeline = new ArrayList<DBObject>();
BasicDBObject group = new BasicDBObject();
group.put("$group", new BasicDBObject("_id","$author")
.append("count", new BasicDBObject("$sum",1))
.append("name", new BasicDBObject("$first","$author")));
BasicDBObject project = new BasicDBObject();
project.put("$project", new BasicDBObject("name",1)
.append("count", 1).append("_id", 0));
pipeline.add(group);
pipeline.add(project);
AggregationOutput output = mongoTemplate.getCollection("article_info").aggregate(pipeline);
Iterable<DBObject> iterable = output.results();
for (DBObject dbObject : iterable) {
System.out.println(dbObject);
}
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- Flutter上线项目实战记录之路由篇
- 使用 Paging 3 实现分页加载
- Android实现圆形渐变加载进度条
- Kotlin 协程和 Android SQLite API 中的线程模型
- Android轮播图点击图片放大效果的实现方法
- 隐私策略更新 | Android 11 应用兼容性适配
- Android android:exported = true 用法详解
- Android WorkManager浅谈
- 详解Android 8.0以上系统应用如何保活
- 秒级去重:ClickHouse在腾讯海量游戏营销活动分析中的应用
- android studio 3.4配置Android -jni 开发基础的教程详解
- android TextView中识别多个url并分别点击跳转方法详解
- Android WebView支持input file启用相机/选取照片功能
- 谈谈RxJava2中的异常及处理方法
- Android Koin2基本使用的那件事儿