MongoTemplate 多表联查,以及出现的问题
2023-06-28 本文已影响0人
李小二的倔强
红尘波浪两茫茫,忍辱求和是妙方。从来硬弩弦先断,自古钢刀口易伤。人为贪财身先死,鸟为夺食命早亡。任你奸猾多取巧,难免荒郊土内藏。
要使用MongoTemplate以A表为主表,联查A表、B表和C表,你可以使用聚合(Aggregation)框架和$lookup操作符来实现。
示例,演示如何使用MongoTemplate以A为主表进行A表、B表和C表的联查:
假设你有三个集合,分别是"tableA"、"tableB"和"tableC",其中"tableB"的属性包含了"tableA"的id值,"tableC"的属性包含了"tableB"的id值。
1、创建实体类:
@Document(collection = "tableA")
public class TableA {
@Id
private String id;
// 其他属性及对应的getter和setter方法
}
@Document(collection = "tableB")
public class TableB {
@Id
private String id;
private String tableAId;
// 其他属性及对应的getter和setter方法
}
@Document(collection = "tableC")
public class TableC {
@Id
private String id;
private String tableBId;
// 其他属性及对应的getter和setter方法
}
2、编写联查逻辑:
@Autowired
private MongoTemplate mongoTemplate;
public List<ABCInfo> getABCInfo() {
Aggregation aggregation = Aggregation.newAggregation(
Aggregation.match(new Criteria()), // 在此处添加筛选条件,如果需要的话
Aggregation.lookup("tableB", "_id", "tableAId", "b"), // 连接B表并存储到"b"字段
Aggregation.lookup("tableC", "b._id", "tableBId", "c") // 连接C表并存储到"c"字段
);
AggregationResults<ABCInfo> results = mongoTemplate.aggregate(aggregation, "tableA", ABCInfo.class);
return results.getMappedResults();
}
3、创建一个DTO类来表示联查结果:
public class ABCInfo {
private String id;
private List<TableB> b;
private List<TableC> c;
// 其他属性及对应的getter和setter方法
}
在上述示例中,我们使用了两个Aggregation.lookup操作来连接B表和C表,并将连接结果分别存储到"b"和"c"字段中。注意,第一个lookup操作连接B表时,使用了"b._id"作为连接字段,这是因为它是嵌套在A表下的子字段。
在需要添加筛选条件时,你可以使用Aggregation.match来指定筛选条件,根据具体需求修改代码。
最后,通过调用aggregate方法执行聚合查询,并使用getMappedResults()方法获取映射后的结果。
问题:关联之后没有B、C表的数据,后来发现关联字段是"_id”,换个字段立马有了数据。
{
"id": "649a9ccb3d8878696e86d28c",
"username": "456",
"content": "评论内容2",
"file": "文件",
"postId": "649a922a3d35aa136dd6bb03",
"updateTime": "2023-06-27 16:24:43",
"commentReplys": [],
"anonymous": false
},
总结:关联字段不能用“_id”,只能用另外一个新字段
{
"id": "649a9ccb3d8878696e86d28c",
"username": "456",
"content": "评论内容2",
"file": "文件",
"postId": "649a922a3d35aa136dd6bb03",
"updateTime": "2023-06-27 16:24:43",
"commentReplys": [
{
"username": "123",
"content": "回复评论1",
"commentId": "649a9ccb3d8878696e86d28c",
"updateTime": "2023-06-27 16:35:41",
"anonymous": false
},
{
"username": "123",
"content": "回复评论2",
"commentId": "649a9ccb3d8878696e86d28c",
"updateTime": "2023-06-27 16:35:47",
"anonymous": false
},
{
"username": "456",
"content": "回复评论2",
"commentId": "649a9ccb3d8878696e86d28c",
"parentReplyId": "649a9f5daa12d41913b6f808",
"updateTime": "2023-06-27 16:44:09",
"anonymous": false
}
],
"anonymous": false
},