• mongoDB多表联查以及MongoTemplate的表联查API使用


    一对一联查

    结构

    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:{}//正常查询
    16.         $match:{'or':[,]}//多条件查询    或
    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 aggregate = MongoTemplate.aggregate(aggregation, MongoColConfig.COL_RISK_GROUP_INFO, JSONObject.class);
    6. if (!ObjectUtils.isEmpty(aggregate) && MyCollectionUtil.isNotEmpty(aggregate.getMappedResults())) {
    7. List 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 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 assistDataAnnexes;
    34. }
    35. }

    java代码

    1. Criteria criteria = new Criteria();
    2. List 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 aggregatePage = MongoTemplate.aggregate(aggregationPage, MongoColConfig.SEND_ASSIST_BASE, SendAssistBaseJointQuery.class);
    62. if (!ObjectUtils.isEmpty(aggregatePage) && MyCollectionUtil.isNotEmpty(aggregatePage.getMappedResults())) {
    63. List 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 aggregateTotal = MongoTemplate.aggregate(aggregationTotal, MongoColConfig.SEND_ASSIST_BASE, JSONObject.class);
    70. if (!ObjectUtils.isEmpty(aggregateTotal) && MyCollectionUtil.isNotEmpty(aggregateTotal.getMappedResults())) {
    71. aggregateTotal.getMappedResults().size();
    72. }
  • 相关阅读:
    oppo A57刷机包更新
    ul滚动卡顿解决办法分享
    大数据学习技术栈及书籍推荐
    AAAI-24 | EarnHFT:针对高频交易的分层强化学习(RL)框架 附代码实现
    人工智能神经网络的应用,人工智能神经网络技术
    24、Flink 的table api与sql之Catalogs(java api操作数据库、表)-2
    智乃酱的平方数列(线段树维护2次函数)
    (九)数据结构-二叉树
    Java环境安装即配置
    2023年计划
  • 原文地址:https://blog.csdn.net/liangjiabao5555/article/details/126042170