mongo数据库3张连表的查询条件查询

关于mongoTemplate的联表查询,以前没有写过代码,现在刚好有业务所以记录一下连表条件查询

案例

  我们的需求是查询出当前的用户所订购的所有的业务信息以及这个业务的累计表的某些字段值?那么怎么做呢?

下面是表结构

表A:业务基础信息表 

表B:业务订购表

表C:业务统计表

我们的传参是需要传入用户手机号作为一个userId去关联哪个用户订购的业务,所以需要在用户订购表进行筛选数据

代码如下:

   LookupOperation lookup1 = LookupOperation.newLookup()
                    .from("B") //次表
                    .localField("id") //主表关联字段
                    .foreignField("id") //次表关联字段
                    .as("B"); //临时集合别名

   LookupOperation lookup2 = LookupOperation.newLookup()
                    .from("C") //次表
                    .localField("id") //主表关联字段
                    .foreignField("id") //次表关联字段
                    .as("C"); //临时集合别名

接着我们再构建Aggregation

Aggregation aggregation = Aggregation.newAggregation(
                    //主表条件 状态值为1,未删除
                    Aggregation.match(Criteria.where("status").is(1)),
                    //联表
                    lookup1,
                    //次表条件 
                    Aggregation.unwind("B"),
    
                     //联表
                    lookup2,
                    //次表条件 
                    Aggregation.unwind("C"),
                    // 说明这里的tel是传入的用户手机号
                    Aggregation.match(Criteria.where("C.tel").is(tel)),
                    // 这里可以把从表的条件进行单独命名,最后查出来的结果就是重新命名的结果
                    Aggregation.project("id","name","xxx","B.allCount","C.ownCount")
            );

 最后就将构造的aggregation进行传入查询方法中

    // 第一个参数是条件参数,第二个是主表的表名,第三个参数是你要映射返回的VO对象, 这里要和project命名的参数进行对应
   AggregationResults<JSONObject> results = mongoTemplate.aggregation(aggregation,"A",xxxx.class);

最后一步:处理数据:

获取结果调用getMappedResults()方法 得到List的JSONObject对象,之后就可以自己构造集合返回,完毕

posted @ 2024-02-04 15:59  程序员hg  阅读(276)  评论(0编辑  收藏  举报