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);
相关文章
|
17小时前
|
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
11 0
|
17小时前
Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘id‘ in field list is ambiguous
Cause: java.sql.SQLIntegrityConstraintViolationException: Column ‘id‘ in field list is ambiguous
21 0
|
17小时前
mongoTemplate 嵌套对象包含id
mongoTemplate 嵌套对象包含id
18 0
|
17小时前
mongoTemplate根据id模糊分页条件查询
mongoTemplate根据id模糊分页条件查询
25 0
|
17小时前
|
开发框架 .NET C#
C# Dictionary<string, string> 对key做筛选
C# Dictionary<string, string> 对key做筛选
28 2
|
17小时前
|
Java 测试技术
List<实体类>转map<String,String>及重复处理
List<实体类>转map<String,String>及重复处理
38 0
|
17小时前
|
Java 数据库连接 mybatis
mybatis返回结果为List<Map<String, Object>>的写法
mybatis返回结果为List<Map<String, Object>>的写法
|
17小时前
|
Java 数据库连接 mybatis
mybatis 返回List<String>
mybatis 返回List<String>
104 0
|
6月前
|
Java 数据库
大字段 CLOB/BOLB与String互转
大字段 CLOB/BOLB与String互转
|
8月前
grep 查询 包含string1、string2和string3的行
您可以使用以下命令来查询包含多个字符串的行: ``` grep 'string1.*string2.*string3' filename ``` 其中,`string1`、`string2`和`string3`是您要过滤的字符串,`filename`是要查询的文件名。 上述命令使用正则表达式来匹配包含`string1`、`string2`和`string3`的行,并将结果输出。`.`表示匹配任意字符,`*`表示匹配前面的字符0次或多次。 您还可以使用`-E`选项来启用扩展正则表达式模式,以实现更复杂的匹配模式: ``` grep -E 'string1|string2|string3' f