一、数据导入导出(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 字段中的数组展开,使每个订单成为一个独立的文档。