当前位置:   article > 正文

mongoDB多表联查以及MongoTemplate的表联查API使用_mongotemplate连表查询

mongotemplate连表查询

一对一联查

结构

  1. //多表联查
  2. db.TABLE_NAME.aggregate([
  3.     {
  4.         $lookup:{//连表
  5.             from:'table0',    //被关联的表名
  6.             localField:'localField',    //关联标识符    主动关联的表
  7.             foreignField:'foreignField',    //关联标识符    被关联的表
  8.             as:'table0'        //被关联的表的别名,下面涉及到被关联的表的操作,都用这个
  9.         }
  10.     },
  11.     {
  12.         $unwind:'$table0'//扁平化,将数组数据拆分    被关联的表
  13.     },
  14.     {
  15.         $match:{<query>}//正常查询
  16.         $match:{'or':[<query>,<query>]}//多条件查询    或
  17.     },
  18.     {
  19.         $project:{                //要显示的字段
  20.             '_id':0,    //_id
  21.             'F1':'$table.f1',//取别称    主动关联的表的数据
  22.             'F2':'$table0.f2',    被关联的表的数据
  23.             'F3':{//case when
  24.                 $cond:{if:{$gte:['$f3',30]},then:0,else:50}
  25.             }
  26.         }
  27.     },
  28. ]).forEach(function(item)){    //遍历    对多表联查出来的数据做操作    一般创建新表
  29.     db.aaaa.insert(item);    //创建新表
  30. }

案例

  1. db.risk_group_info.aggregate([
  2.     {
  3.         '$lookup':{
  4.             'from':'person',
  5.             'localField':'person_id',
  6.             'foreignField':'_id',
  7.             'as':'person'
  8.         }
  9.     },
  10.     {'$unwind':'$person'},
  11.     {
  12.         '$project':{
  13.             'name':'$person.name'
  14.          }
  15.      }
  16. ])

结果

java代码

  1. Aggregation aggregation = Aggregation.newAggregation(
  2. Aggregation.lookup(MongoColConfig.COL_PERSON, "person_id", "_id", "person"),
  3. Aggregation.unwind("person", true),
  4. Aggregation.project("person.name").and("person.name").as("name"));
  5. AggregationResults<JSONObject> aggregate = MongoTemplate.aggregate(aggregation, MongoColConfig.COL_RISK_GROUP_INFO, JSONObject.class);
  6. if (!ObjectUtils.isEmpty(aggregate) && MyCollectionUtil.isNotEmpty(aggregate.getMappedResults())) {
  7. List<JSONObject> mappedResults = aggregate.getMappedResults();
  8. }

一对多联查

主表一条数据对应联查的副表的多条数据,主表对象中的集合存放副表的多条数据

mongo接收实体

  1. @Data
  2. public class SendAssistBaseJointQuery {
  3. private String id;
  4. private String primaryId;
  5. private String taskId;
  6. private String taskType;
  7. private String riskPersonType;
  8. private String caseId;
  9. private String caseName;
  10. private String pointPositionId;
  11. private String sitePointPositionName;
  12. private String pointPositionType;
  13. private String assistDataInfoId;
  14. private String cancelReason;
  15. private String backReason;
  16. private String backTime;
  17. private String dataSource;
  18. private String updateTime;
  19. // 任务表字段
  20. private String createTime;
  21. private String dealUsername;
  22. private String taskStatus;
  23. String sendAssistTaskStatus;
  24. String receiveFeedbackTaskStatus;
  25. private List<AssistDataInfo> assistDataInfos;
  26. @Data
  27. // assist_data_info表中字段
  28. public class AssistDataInfo {
  29. private String type;
  30. private String assistLetterName;
  31. private Integer sendCount;
  32. private Integer feedbackCount;
  33. private List<String> assistDataAnnexes;
  34. }
  35. }

java代码

  1. Criteria criteria = new Criteria();
  2. List<AggregationOperation> aggregationOperation = new ArrayList<>();
  3. aggregationOperation.add(Aggregation.match(criteria));
  4. // 主表一对一,关联task表
  5. aggregationOperation.add(Aggregation.lookup(MongoColConfig.COL_TASK, "task_id", "_id", "task"));
  6. aggregationOperation.add(Aggregation.unwind("task", true));
  7. // 主表一对多,关联assist_data_info表
  8. aggregationOperation.add(Aggregation.lookup(MongoColConfig.ASSIST_DATA_INFO, "task_id", "task_id", "assist_data_info"));
  9. aggregationOperation.add(Aggregation.unwind("assist_data_info", true));
  10. aggregationOperation.add(Aggregation.project("_id")
  11. .and("_id").as("primary_id")
  12. .and("site_point_position_name").as("site_point_position_name")
  13. .and("task_id").as("task_id").and("task_type").as("task_type")
  14. .and("risk_person_type").as("risk_person_type").and("case_id").as("case_id")
  15. .and("case_name").as("case_name").and("point_position_id").as("point_position_id")
  16. .and("site_point_position_name").as("site_point_position_name").and("point_position_type").as("point_position_type")
  17. .and("assist_data_info_id").as("assist_data_info_id").and("cancel_reason").as("cancel_reason")
  18. .and("back_time").as("back_time")
  19. .and("data_source").as("data_source").and("update_time").as("update_time")
  20. .and("task.deal_username").as("deal_username").and("task.create_time").as("create_time")
  21. .and("task.task_status").as("task_status")
  22. .and("task.send_assist_task_status").as("send_assist_task_status")
  23. .and("task.receive_feedback_task_status").as("receive_feedback_task_status")
  24. .and("task.cancel_reason").as("cancel_reason")
  25. .and("task.back_reason").as("back_reason")
  26. .and("assist_data_info.type").as("type")
  27. .and("assist_data_info.assist_data_annexes").as("assist_data_annexes").and("assist_data_info.feedback_count").as("feedback_count")
  28. .and("assist_data_info.assist_letter_name").as("assist_letter_name").and("assist_data_info.send_count").as("send_count"));
  29. Aggregation aggregationPage = Aggregation.newAggregation(aggregationOperation);
  30. // 这些被basicDBObject.append的字段为assist_data_info表中字段。使用list集合接收
  31. BasicDBObject basicDBObject = new BasicDBObject();
  32. basicDBObject.append("type", "$type");
  33. basicDBObject.append("assist_data_annexes", "$assist_data_annexes");
  34. basicDBObject.append("assist_letter_name", "$assist_letter_name");
  35. basicDBObject.append("feedback_count", "$feedback_count");
  36. basicDBObject.append("send_count", "$send_count");
  37. // 根据task_id字段聚合,取每个字段第一个字段附别名。(这些是主字段)
  38. aggregationPage.getPipeline().add(Aggregation.group("task_id")
  39. .first("primary_id").as("primary_id")
  40. .first("site_point_position_name").as("site_point_position_name")
  41. .first("task_id").as("task_id").first("task_type").as("task_type")
  42. .first("risk_person_type").as("risk_person_type").first("case_id").as("case_id")
  43. .first("case_name").as("case_name").first("point_position_id").as("point_position_id")
  44. .first("site_point_position_name").as("site_point_position_name").first("point_position_type").as("point_position_type")
  45. .first("assist_data_info_id").as("assist_data_info_id").first("cancel_reason").as("cancel_reason")
  46. .first("back_reason").as("back_reason").first("back_time").as("back_time")
  47. .first("data_source").as("data_source").first("update_time").as("update_time")
  48. .first("deal_username").as("deal_username").first("create_time").as("create_time")
  49. .first("cancel_reason").as("cancel_reason")
  50. .first("task_status").as("task_status")
  51. .first("send_assist_task_status").as("send_assist_task_status")
  52. .first("receive_feedback_task_status").as("receive_feedback_task_status")
  53. // 需要和实体中assistDataInfos对应,集合名接收关联assist_data_info表中数据
  54. .addToSet(basicDBObject).as("assist_data_infos"));
  55. // 分页
  56. int skip = (pageReq.getPage() - 1) * pageReq.getPageSize();
  57. aggregationPage.getPipeline().add(Aggregation.sort(Sort.Direction.DESC, "create_time"));
  58. aggregationPage.getPipeline().add(Aggregation.skip((long) skip));
  59. aggregationPage.getPipeline().add(Aggregation.limit(ret.getPageSize()));
  60. aggregationPage = aggregationPage.withOptions(AggregationOptions.builder().allowDiskUse(true).build());
  61. AggregationResults<SendAssistBaseJointQuery> aggregatePage = MongoTemplate.aggregate(aggregationPage, MongoColConfig.SEND_ASSIST_BASE, SendAssistBaseJointQuery.class);
  62. if (!ObjectUtils.isEmpty(aggregatePage) && MyCollectionUtil.isNotEmpty(aggregatePage.getMappedResults())) {
  63. List<SendAssistBaseJointQuery> mappedResults = aggregatePage.getMappedResults();
  64. }
  65. // 总数
  66. aggregationTotal.getPipeline().add(Aggregation.group("task_id").count().as("count"));
  67. aggregationPage = aggregationPage.withOptions(AggregationOptions.builder().allowDiskUse(true).build());
  68. aggregationTotal = aggregationTotal.withOptions(AggregationOptions.builder().allowDiskUse(true).build());
  69. AggregationResults<JSONObject> aggregateTotal = MongoTemplate.aggregate(aggregationTotal, MongoColConfig.SEND_ASSIST_BASE, JSONObject.class);
  70. if (!ObjectUtils.isEmpty(aggregateTotal) && MyCollectionUtil.isNotEmpty(aggregateTotal.getMappedResults())) {
  71. aggregateTotal.getMappedResults().size();
  72. }
声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/article/detail/56037
推荐阅读
相关标签
  

闽ICP备14008679号