MongoTemplate 多表查询中 将String转换为ObjectId

简介: MongoTemplate 多表查询中 将String转换为ObjectId

本人在使用mongoTemplate中使用多表查询中,主表主键为id,类型为objectid,想要在purchased表对trades表进行lookup多表查询,根据good_id查询对应的trade表中的信息(Good实体类),在mongotemplate中project的convert操作坑中绕了许久,于是在此记录
主表的结构为 根据good_id进行查询,需要在project中更改其类
@Data
@Document("purchaseds")
public class Purchased {
@Id
private ObjectId id;
private String good_id;//这里为string类型 坑的起点
private int status;
private Long timestamp;
private String buyer_id;
private String owner_id;
}
从表的结构
@Data
@Document("trades")
public class Good {
@Id
private ObjectId id;
private long total_count;//总量
private long count;//余量
private List images;
private String owner_id;
private String title;
private String desc;
private Double price;
private int status;
@Transient
public static final int COMMON=1;//正常销售
@Transient
public static final int TAKE_DOWN=2;//下架了
}

所以使用lookup对good表进行查询
db.purchaseds.aggregate([
{
$lookup: {
from: "trades",
localField: "good_id",
foreignField: "_id",
as: "good_list"
}
}
])

但是因为主表的good_id字段为string类型 good表的主键为objectid类型,所以匹配不到good表中的数据
所以要通过project操作符,并在其中改变类型,所以对应的mongo应该执行为以下
db.purchaseds.aggregate([
{
$project: {
good_object_id: {//一个新的字段
$convert: {
"input": "$good_id",//主表的需要转换的字段
"to": "objectId"//转换为objectId
}
}
}
},
// 联表查询
{
$lookup: {
from: "trades",//被join的集合
localField: "good_object_id",//上个阶段指定查询的field
foreignField: "_id",//trades表下与good_object_id对应的字段
as: "good_list" //新的字段为一个list,如有需要可以查询
}
}
])

注意!!! 在进行mongotemplate的多表查询时,因为会新建一个字段(当然也可以保留)所以我们需要新建一个dto对象用于存储这个中间变量
public class purchaseDto extends Purchased {
private ObjectId good_object_id;
private List good_info;//接受返回值
}

    Aggregation aggregation=Aggregation.newAggregation(
            Aggregation.project()
                .and(ConvertOperators.Convert.convertValue("$good_id").to("objectId"))//将good_id转换为objectId
                .as("good_object_id"),//新字段名称
            Aggregation.lookup("trades","good_object_id","_id","good_info")
    );
    AggregationResults aggregationResults= mongoTemplate.aggregate(aggregation,"purchaseds", purchaseDto.class);
    System.out.println(aggregationResults);
相关文章
|
6月前
|
Java 测试技术 数据库
hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice
hql投影查询之—— [Ljava.lang.Object; cannot be cast to cn.bdqn.guanMingSys.entity.Notice
|
6月前
|
开发框架 .NET C#
C# Dictionary<string, string> 对key做筛选
C# Dictionary<string, string> 对key做筛选
71 2
|
6月前
mongoTemplate 嵌套对象包含id
mongoTemplate 嵌套对象包含id
62 0
|
6月前
Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘id‘ in field list is ambiguous
Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘id‘ in field list is ambiguous
116 0
|
6月前
|
Java 数据库连接 mybatis
mybatis返回结果为List<Map<String, Object>>的写法
mybatis返回结果为List<Map<String, Object>>的写法
592 1
|
6月前
|
Java 测试技术
List<实体类>转map<String,String>及重复处理
List<实体类>转map<String,String>及重复处理
267 0
|
Java 数据库
大字段 CLOB/BOLB与String互转
大字段 CLOB/BOLB与String互转
StringUtils.join()方法与String.join()方法的使用
StringUtils.join()方法与String.join()方法的使用
UUID.randomUUID().toString() 生成主键 介绍与使用
UUID.randomUUID().toString() 介绍 UUID.randomUUID().toString()是javaJDK提供的一个自动生成主键的方法。 UUID(Universally Unique Identifier)全局唯一标识符,是指在一台机器上生成的数字 它保证对在同一时空中的所有机器都是唯一的 是由一个十六位的数字组成,表现出来的形式
231 0
有关String.join()方法的使用
有关String.join()方法的使用
277 0