1背景问题描述
如果觉得有用记得给个关注
import org.bson.Document;
工作中使用关联查询两个表并返回Document map给前端进行数据展示发现数据结构有问题好多字段为ArrayList类型
相关截图及语句如下:
优化前语句 去除部分敏感字段
MatchOperation matchOperation = Aggregation.match(Criteria.where("username").is(username));
LookupOperation lookupOperation = LookupOperation.newLookup()
.from(mongoTemplate.getCollectionName(bbb.class)).localField("courseObjectId").foreignField("_id")
.as("courses");
ProjectionOperation projectionOperation = Aggregation.project("type","recommendTime" )
.and("courses.cover").as("cover")
.andExclude("_id")
;
Aggregation aggregation = Aggregation.newAggregation(
matchOperation,
Aggregation.project( "type").and("createTime").as("recommendTime").andExpression("{$toObjectId:'$courseId'}").as("courseObjectId"),
lookupOperation,
projectionOperation,
Aggregation.sort(Sort.by(Sort.Direction.DESC, "recommendTime"))
);
List<Document> results = mongoTemplate.aggregate(aggregation, aaa.class, Document.class)
.getMappedResults();
返回数据为
可以看到我标出的两个地方
第一个为 Integer类型的type 获取到的却为double类型 这样在前端进行类型匹配的时候会有问题
第二个为grade 字段 lookup语句关联查询的只有一条记录但是project到的字段也是ArrayList类型
2解决方案
思路:
首先去官网查询管道命令看哪个比较像。。
过了一遍发现以下几个可以试试
$arrayElemAt 获取数组指定位置元素
$convert 转换数据 格式比较复杂
$toInt 转换为int类型 可以根据需要有几个类似地语法 比较方便
相关链接我会放最后
优化后代码
MatchOperation matchOperation = Aggregation.match(Criteria.where("username").is(username));
LookupOperation lookupOperation = LookupOperation.newLookup()
.from(mongoTemplate.getCollectionName(bbb.class)).localField("courseObjectId").foreignField("_id")
.as("courses");
ProjectionOperation projectionOperation = Aggregation.project("type","recommendTime" )
//通过arrayElementAt(0)获取数组第一位数据
.and("courses.education").arrayElementAt(0).as("grade")
.andExclude("_id")
;
Aggregation aggregation = Aggregation.newAggregation(
matchOperation,
//这里对type进行toInt处理 toObjectId是将字符串转换为ObjectId类型 以前有讲过
Aggregation.project( ).andExpression(" { $toInt:'$type'}").as("type").and("createTime").as("recommendTime").andExpression("{$toObjectId:'$courseId'}").as("courseObjectId"),
lookupOperation,
projectionOperation,
Aggregation.sort(Sort.by(Sort.Direction.DESC, "recommendTime"))
);
List<Document> results = mongoTemplate.aggregate(aggregation, aaa.class, Document.class)
.getMappedResults();
可以看到数据类型已经改为期望状态