Bootstrap

springBoot整合mongodb之聚合操作

一、数据导入导出(mongoimport)

1.导入工具地址https://www.mongodb.com/try/download/database-tools
在这里插入图片描述
2.配置环境变量
在这里插入图片描述
在环境变量path添加对应bin路径
在这里插入图片描述

3.导入数据文件https://media.mongodb.org/zips.json
在这里插入图片描述
4.导入命令

//导入帮助文档查询
mongoimport --help
//导入
mongoimport --db=数据库名 --collection=集合名 --file=导出文件路径

5.导出命令

//导出帮助文档查询
mongoexport --help
//导出
mongoexport --db=数据库名 --collection=集合名 --out=导出文件路径

二、聚合操作

1、基于管道,mongodb提供可操作内容:

在这里插入图片描述

2、基于聚合操作Aggregation.group(),mongodb提供可操作内容:

在这里插入图片描述

3、代码示例

3.1、实体类

@Data
@Document("zips")
@NoArgsConstructor
@AllArgsConstructor
public class Zips {
    //唯一标识ID
    @MongoId
    private String id;
    //城市
    @Field
    private String city;
    //经纬度
    @Field
    private List<Double> loc;
    //人口数量
    @Field
    private Integer pop;
    //属于的州
    @Field
    private String state;
}

3.2、计算州平均数

//计算每个州,每个城市的平均人口数量 按照人口数量倒叙

//按照州和城市分组 计算人口总数
GroupOperation groupOperation = Aggregation.group("state","city")
        .sum("pop").
        as("cityPop");

//按照对应州计算对于城市平均值
GroupOperation groupOperation1 = Aggregation.group("_id.state")
        .avg("cityPop").
        as("avgCityPop");

//对于人口数据进行排序处理
SortOperation sortOperation = Aggregation.sort(Sort.Direction.DESC,"avgCityPop");

//按照指定顺序组合上面的阶段
//定义返回值类型 按照顺序处理对于数据
TypedAggregation<Zips> zipsTypedAggregation = Aggregation.newAggregation(
        Zips.class, groupOperation, groupOperation1,sortOperation);
//调取对应需求api结果
AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(zipsTypedAggregation, Map.class);
//取出结果
List<Map> mappedResults = aggregationResults.getMappedResults();
mappedResults.forEach(System.out::println);

3.3、去州内人口最大最小城市

public void maxMinPop() {
   //获取每个州里面城市名称以及最大最小人口数量

   //对于每个区域和城市人口排序 $Group
   GroupOperation groupOperation = Aggregation.group("state","city")
           .sum("pop").as("cityPop");
   //对于每个州按照城市排序
   SortOperation sortOperation = Aggregation.sort(Sort.Direction.ASC,"cityPop");

   //获取最大最小数据 通过分组筛选
   GroupOperation groupOperation1 = Aggregation.group("_id.state")
           .last("_id.city").as("bigCity")
           .last("cityPop").as("bigCityPop")
           .first("_id.city").as("smallCity")
           .first("cityPop").as("smallCityPop");

   //通过Project获取自己所需字段
   ProjectionOperation projectionOperation = Aggregation.project("bigCity","smallCity","state")
           .andExclude("_id") //排除Id
           .andExpression("{name:\"$bigCity\",pop:\"$bigCityPop\"}") //表达式展示数据
           .as("bigCity")
           .andExpression("{name:\"$smallCity\",pop:\"$smallCityPop\"}") //表达式展示数据
           .as("smallCity")
           .and("_id")
           .as("state");

   //排序处理数据
   SortOperation sortOperation1 = Aggregation.sort(Sort.Direction.ASC,"state");

   //按照指定顺序组合上面的阶段
   //定义返回值类型 按照顺序处理对于数据
   TypedAggregation<Zips> zipsTypedAggregation = Aggregation.newAggregation(
           Zips.class, groupOperation, sortOperation,groupOperation1,
           projectionOperation,sortOperation1);

   //调取对应需求api结果
   AggregationResults<Map> aggregationResults = mongoTemplate.aggregate(zipsTypedAggregation, Map.class);
   //取出结果
   List<Map> mappedResults = aggregationResults.getMappedResults();
   mappedResults.forEach(System.out::println);
}

3.4、连表查询

3.4.1、实体类

用户表

@Document(collection = "users")
public class User {

    @Id
    private String id;
    private String username;
    // other fields, constructors, getters/setters
}

关联表

@Document(collection = "orders")
public class Order {

    @Id
    private String id;
    private Date orderDate;
    private double total;
    @Field("user_id")
    private String userId; // referencing User id
    // other fields, constructors, getters/setters
}
3.4.2、关联代码
@Autowired
private MongoTemplate mongoTemplate;

public List<User> getUsersWithOrders() {
    // 构建聚合操作
    TypedAggregation<User> aggregation = Aggregation.newAggregation(User.class,
            Aggregation.lookup("orders", "_id", "user_id", "orders"),
            Aggregation.unwind("orders", true));

    // 执行聚合操作
    AggregationResults<User> results = mongoTemplate.aggregate(aggregation, User.class);
    return results.getMappedResults();
}
3.4.3、解析聚合操作

使用 Aggregation.newAggregation(User.class, …) 创建一个聚合操作,指定主集合为 User.class。
Aggregation.lookup(“orders”, “_id”, “user_id”, “orders”) 执行一个左外连接,将 orders 集合中的订单数据关联到 users 集合中的每个用户文档中的 orders 字段。
Aggregation.unwind(“orders”, true) 将 orders 字段中的数组展开,使每个订单成为一个独立的文档。

;