spring实现 mongodb 关联查询单条记录的返回值为ArrayList的处理优化 $toInt $arrayElemAt

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();

在这里插入图片描述
可以看到数据类型已经改为期望状态

3.参考链接

$arrayElemAt官方文档

$convert官方文档

$toInt

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值