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
        },
上一篇 下一篇

猜你喜欢

热点阅读