springbootmongodb统计表中某一字段的所有值,其中aggregate的用法之一

更新时间:2023-06-18 10:19:25 阅读: 评论:0

springbootmongodb统计表中某⼀字段的所有值,其中
aggregate的⽤法之⼀
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
yml⽂件配置:
data:
mongodb:
port: 27017
host: //(IP地址)
databa: test
这⾥因为⽤nosql,⾮关系型数据库,所以只说明⾮实体类统计的⽤法,即,数据库中的表没有对应的实体类;
需求是:统计表中某列的总和
代码:
public Long getSumByScoreField(String name, String subject, String time) {
DBCollection collection = Collection("ur");//ur为表
String matchStr = "{\"$match\":{\"name\":\"" + name+ "\",\"subject\":\"" + subject+ "\",\"login_time\":\"" + time + "\"}}";图书捐赠
String groupStr = "{\"$group\":{\"_id\": null,\"total\":{\"$sum\": \"$score\"}}}";
System.out.println(JSON.par(matchStr));
DBObject match = (DBObject) JSON.par(matchStr);
DBObject group = (DBObject) JSON.par(groupStr);
LinkedList<DBObject> list= new LinkedList<>();
objects.add(match);
objects.add(group);
Cursor cursor = collection.aggregate(list, AggregationOptions.builder().outputMode(AggregationOptions.OutputMode.CURSOR).build());
while (cursor.hasNext()){
System.out.());
}
宿舍文化节征文}
以上代码中如果是第⼀次接触的同⾏就有⼀些陌⽣的关键字,如:$match,$group,$sum,这三个皆为对应mongodb的关键字,山药炖羊排的做法
match是依据的条件查询,group是分组查询,在该需求就会⽤到,sum聚合函数求总和,还有⼀个$score,这个是表中的字段score,因为要求和的正是该字段的和,固定写法⽽已,⾄于其他字段都是表的字段,注意这⾥没有对应的POJO类。
上述的代码中有这么⼀段代码:
Cursor cursor = collection.aggregate(list,
AggregationOptions.builder().outputMode(AggregationOptions.OutputMode.CURSOR).build());
需要额外说明⼀下,这段代码之前我是这么写的:
AggregationOutput aggregate2 = collection.aggregate(match, group);
或者是:
AggregationOutput aggregate2 = collection.aggregate(list);
这么写的,很多时候在执⾏到这段代码的时候会出错,所以就改成上述代码段⾥的写法了因为当写成上⾯红⾊代码的两种⽅式时会报错:
麻辣海鲜锅aggregate with the explain argument' on rver 192.168.31.14:27017. The full respon is { "ok" : 0.0, "errmsg" : "The
'cursor' option is required, except for aggregate with the explain argument", "code" : 9, "codeName" : "FailedToPar" }
db.CommandFailureException(ProtocolHelper.java:115) ~[mongodb-driver-
core-3.4.3.jar:na]
这种报错要么是依赖的mongodb版本和spring-bootstart版本不同,要么就是:这⾥细⼼的同⾏会发现,错误的(标红字)和正确的(代
码段⾥⾯的)返回值类型不同,Cursor为输⼊模型的,AggregationOutput 为输出模型的,默认是输出模型,所以,当出现上述异常时可
以改下代码为输⼊模型即可;
上述代码段还可以有⼀下写法:
public Long getSumByScoreField(String name, String subject, String time) {
BasicDBObject basicDBObject = new BasicDBObject();
//        basicDBObject.put("name", name);
//        basicDBObject.put("subject", subject);
//        basicDBObject.put("update_time", time);
BasicDBObject[] basicDBObjects = {new BasicDBObject("name", name), new BasicDBObject("subject", subject), new BasicDBObject("update_time", time)}; //        BasicDBObject basicDBObject = new BasicDBObject();
basicDBObject.put("$and", basicDBObjects);
人五行属什么BasicDBObject smatch = new BasicDBObject();
smatch.put("$match", basicDBObject);
BasicDBObject dbObject = new BasicDBObject("_id", null);
dbObject.put("total", new BasicDBObject("$sum", "$score"));
//        DBObject group = new BasicDBObject("$group", dbObject);
List list = new LinkedList();
list.add(smatch);
list.add(group);
Cursor aggregate = collection.aggregate(list, AggregationOptions.builder().outputMode(AggregationOptions.OutputMode.CURSOR).build());
if (aggregate.hasNext()) {
System.out.().get("total"));
}
}
以上的两种写法最终翻译成mysql查询代码为:
lect sum(score) as total from ur where name=? and subject = ?and time=?
mongodb的写法为:
db.ur.aggregate()
.match({"name":"JONE","subject":"数学","update_time":"2019-01-02"}).group({
大一新生自我介绍
肠道不好_id: null,total:{$sum: "$score"}
})
如果是关系型,也就是创建对应表的实体类POJO的话就⽤:(这段代码还没测试,但⼤概思路、⽤法是这样的)
Aggregation aggregation = wAggregation(
match(Criteria.where("name").is(name).and("subject").is(subject).and("update_time").is(time)),
group("_id").sum("score").as("total"),
sort(Sort.Direction.DESC, "total"),
limit(1));
mongoTemplate.aggregate(aggregation,Ur.class,BasicDBObject.class);
补充--分组统计:
需求点:分组查询出选择不同班级,不同学科,不同时间报名中每组的总⼈数及总成绩
mysql:SELECT subject,DATE_FORMAT(sign_up_time,'%Y-%m-%d'),class_name,SUM(urs_quantum) AS
urs_quantum,SUM(score)AS score FROM ur
GROUP BY  class_name,DATE_FORMAT(sign_up_time,'%Y-%m-%d'),subject
关于劝学的诗句
mongodb:aggregate([{$group: { _id: {class_name:"$class_name",subject:"$subject",sign_up_time:"$sign_up_time"},total: {$sum: "$score"},count:{$sum:1}}}])
注意:mongodb sql中双引号⾥⾯的⾃定义字段(除数据库聚合函数,即sql关键字之外的字段)必须加$符号
字段说明:subject-学科,class_name-班级名称,sign_up_time-报名时间,urs_quantum-报名⼈数,score-成绩
以上纯属个⼈的⼀点开发实际来历,希望可以帮到见到的你,如有好的想法、⽅法。
请留⾔,谢谢!

本文发布于:2023-06-18 10:19:25,感谢您对本站的认可!

本文链接:https://www.wtabcd.cn/fanwen/fan/82/982486.html

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。

标签:查询   代码   分组   对应   函数
相关文章
留言与评论(共有 0 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图