Mongodb使用之Aggregation聚合查询:.group()/.project()/.and().previousOperation()等api的使用

最近在项目中遇到了Mongodb在聚合查询上的应用,在这里做一个记录。

Spring Data MongoDB 中的聚合框架支持基于以下关键抽象:AggregationAggregationDefinitionAggregationResults。项目中目前用到的是Aggregation。需要进一步了解的可以看文末相关链接资料。

直接上代码解释:

//目的:查询出每个班里有多少姓张的男生,并用班级代号分组输出
//.group("class").count().as("count")就是以班级分组,计算数量,数量命名为“count”
//project中表示需要输出的字段,.and.as就是“classId”这个字段也要输出,字段名为“cId”,.and("cId").previousOperation就是以“cId”作为分组的“_id”输出)

Criteria criteria = Criteria.where("surname").is("张").and("sex").is("M");

Aggregation aggregation = Aggregation.newAggregation(Aggregation.match(criteria),  
            Aggregation.group("class").count().as("count"),  
Aggregation.project("count","class").and("classId").as("cId").and("cId").previousOperation();  

List<BasicDBObject> result = mongoTemplate.aggregate(aggregation,"t_class" BasicDBObject.class).getMappedResults(); 

 

关于聚合的相关文档整理在下面:

(1)聚合查询(aggregation) 之 project:Spring data mongodb 聚合查询(aggregation) 之 project - JavaShuoproject :控制返回的字段,例如一个实体类,咱们只须要部分字段java 1 插入数据app        mongoTemplate.save(new Role(http://www.javashuo.com/article/p-htmtkzmy-mc.html

(2)MongoDB的使用学习之(七)MongoDB的聚合查询(两种方式)附项目源码 - OnTheRoad_Lee - 博客园先来张在路上……铛铛铛……项目源码下载地址:http://files.cnblogs.com/ontheroad_lee/MongoDBDemo.rar此项目是用Maven创建的,没有使用Maven的https://www.cnblogs.com/ontheroad_lee/p/3756247.html

(3)Mongodb官方文档Spring Data MongoDB - Reference Documentationhttps://docs.spring.io/spring-data/mongodb/docs/current/reference/html/#mongo.aggregation (3)关于Spring-Data-Mongodb中的project()的用法,和previousOperation()的用法_冲吧,不要停!-CSDN博客_java mongodb project关于project()方法的使用1,project("name", "netPrice")    project方法的内容是你要映射的字段,相当于{$project: {sumfavour: 1, userid: 1}}2,project().and("foo").as("bar")    如果你想要把一个字段映射成别一个名字的话,就可以用上面的方法,相当于{$project: {https://blog.csdn.net/hotdust/article/details/52605990

(4)MongoDB mongoTemplate查询条作组合例子https://www.iteye.com/blog/huangyongxing310-2342307https://www.iteye.com/blog/huangyongxing310-2342307 欢迎讨论~

  • 3
    点赞
  • 12
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
这段代码是使用 Spring Data MongoDBAggregation Framework 实现数据聚合的操作,主要包含以下三个步骤: 1. Match:筛选出符合条件的文档,类似于 SQL 中的 WHERE 子句。 2. Group:按照指定的字段进行分组,类似于 SQL 中的 GROUP BY 子句。 3. Project:对分组后的结果进行投影,类似于 SQL 中的 SELECT 子句。 下面是一个使用案例: 假设我们有一个名为 orders 的文档集合,包含以下字段: ``` { "_id": ObjectId("5f1d5a8c4cba2a5bc0a72d1a"), "user_id": 1001, "items": [ { "name": "iPhone 11", "price": 6999 }, { "name": "MacBook Pro", "price": 12999 } ], "create_time": ISODate("2020-07-26T12:00:00Z") } ``` 我们希望统计每个用户的订单总金额,并按照总金额倒序排序,可以使用以下代码实现: ``` // 创建 Match 对象 Criteria match = Criteria.where("create_time").gt(start).lt(end); // 创建 Group 对象 GroupOperation group = Aggregation.group("user_id") .sum("items.price").as("total_price"); // 创建 Project 对象 ProjectionOperation project = Aggregation.project("user_id", "total_price") .andExclude("_id").andInclude("user_id", "total_price"); // 执行聚合操作 Aggregation agg = Aggregation.newAggregation(match, group, project); List<UserOrder> result = mongoTemplate.aggregate(agg, "orders", UserOrder.class).getMappedResults(); ``` 上述代码中,我们首先创建了一个 Match 对象,筛选出符合条件的文档(在指定时间范围内创建的订单)。然后创建了一个 Group 对象,按照 user_id 字段进行分组,并对每个分组内的 items.price 字段求和,得到总金额并将其赋值给 total_price 字段。最后创建了一个 Project 对象,投影出 user_id 和 total_price 两个字段并排除 _id 字段,然后执行聚合操作并将结果映射到 UserOrder 类型的对象列表中。 注意,这里的 UserOrder 类型需要定义为一个包含 user_id 和 total_price 两个字段的 POJO 类型。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值