MongoDB复杂Json数据的增删改查

2023-11-03

本文讲解了MongoDB在java语言下的复杂用法,并附带案例。欢迎各位MongoDB使用者点赞收藏❥提出宝贵的意见。

TImetableDO数据结构:

{
  "orgId": "test_0c8bd2befcae",
  "level": 33,
  "studyStageCode": "test_4e6d1cb07db3",
  "startDate": 50,
  "endDate": 35,
  "timeTableName": "test_f3e7ab9cf540",
  "gradeTimetables": [
    {
      "gradeCode": "test_91d5ee05b73d",
      "gradeName": "test_616641b7e6db",
      "amStartTime": 30,
      "amStartMinute": 54,
      "amEndHour": 5,
      "amEndMinute": 80,
      "pmStartHour": 48,
      "pmStartMinute": 15,
      "pmEndHour": 68,
      "pmEndMinute": 13,
      "duration": 9,
      "classInterval": 77,
      "weeks": [
        {
          "weekNum": 92,
          "weekName": "test_a0c7db38d66e"
        }
      ],
      "lessons": [
        {
          "lessonCode": "test_2f27176bb524",
          "lessonName": "test_4877e17a365d"
        }
      ],
      "scheduleLessons": [
        {
          "weekNum": 27,
          "lessonCode": "test_64bb0f8f6297",
          "subjectCode": "test_5e4d93df1aa1",
          "subjectName": "test_ec76334cae9a",
          "teacherUser": "test_b8e5d0a1747a",
          "teacherName": "test_5977e370d39d",
          "mobile": "test_18747d63bc10",
          "schoolId": "test_c2ba7953dc06",
          "schoolName": "test_10e05269ab81"
        }
      ]
    }
  ],
  "createUser": "test_52c517640053",
  "createName": "test_de010b8aa98e",
  "updateUser": "test_dc57588627ac",
  "updateName": "test_8bf96510716a",
  "updateVersion": 21,
  "id": "test_d225da32cfd0",
  "createTime": "2014-10-29 02:07:11",
  "updateTime": "2029-08-08 02:34:23"
}

 查询单条:

示例1:二层结构查询

//根据年级、课表id-查询发布后的课表结构学科数据
Criteria criteria = Criteria.where(
"timetableId").is(vo.getTimetableId())
.and("gradeTimetables.gradeCode").is(vo.getGradeCode());
TimetableD0 tablePublishDb = mongoTemplate.findOne(Query. query(criteria),TimetableD0.class);

示例2:三层结构查询

ScheduleLesson reqLesson = vo. getScheduleLessons.get(O) ;
Criteria criteria = new Criteria();
criteria.and("_id").is(new objectId(vo. getTimetableId())
.and("gradeTimetables.gradeCode").is(vo.getGradeCode())
.and("gradeTimetables.scheduleLessons.weekNum").is(reqLesson. getWeekNum())
.and("gradeTimetables.scheculeLessons.lessonCode").is(reqLesson. getLessonCode());
TimetableDO timetableD0 =mongoTemplate.findOne(Query.query(criteria),TimetableD0.class);

多层结构类似上面的例子 

新增数据:

当新增的数据结构不存在时,会自动创建结构,可以使用这一方法,addToSet()

criteria = new Criteria();
criteria.and("_id").is(new 0bjectId(vo. getTimetableId())
.and("gradeTimetables.gradeCode").is(vo.getGradeCode());
Update update = new Update();
Query upQuery =Query.query(criteria);
upQuery = Query.query(criteria);
update.addToSet("gradeTimetables.$.scheduleLessons",reqLesson) ;
mongoTemplate.updateMulti(upQuery,update, mongoTemplate.getCollectionName(TimetableD0.class));

当新增的数据scheduleLessons结构存在,需要将数据追加到 scheduleLessons集合下:

TImetablePublishDO数据结构参考:

{
  "timetableId": "test_9dcfb1cce278",
  "orgId": "test_6c11a4a0f541",
  "level": 6,
  "weekStartDate": 74,
  "weekOfYear": 22,
  "timeTableName": "test_83e2eb0eaabe",
  "gradeTimetables": [
    {
      "gradeCode": "test_595a3c80a607",
      "gradeName": "test_f81e785c7e37",
      "lessons": [
        {
          "lessonCode": "test_cee22164732a",
          "lessonName": "test_2729825d7999"
        }
      ],
      "weeks": [
        {
          "weekNum": 6,
          "weekName": "test_4737db2d42a7"
        }
      ],
      "scheduleLessons": [
        {
          "weekNum": 26,
          "lessonCode": "test_5b5b5aca5680",
          "subjectCode": "test_1c81759285bc",
          "subjectName": "test_8a8ece8aaf9b",
          "teacherUser": "test_312420e06c84",
          "teacherName": "test_fb466fa3d249",
          "schoolId": "test_0f6cc223fda5",
          "schoolName": "test_dc6722d6fea3",
          "mobile": "test_1e72b8116113"
        }
      ],
      "timetableResources": [
        {
          "weekStartDate": 70,
          "weekOfYear": 35,
          "weekNum": 78,
          "lessonCode": "test_b4cd7a853c20",
          "date": 84,
          "fileInfos": [
            {
              "fileName": "test_11784cd6d2f6",
              "fileCode": "test_ba01c998e683",
              "fileId": "test_41d4c044c81b",
              "duration": 65,
              "status": 28,
              "onlineStatus": 85,
              "subjectCode": "test_8cba9df8ccd0"
            }
          ]
        }
      ]
    }
  ],
  "publishUser": "test_9e20649e2238",
  "publishName": "test_2f5c024039bf",
  "id": "test_ebcb7203fe31",
  "createTime": "2030-05-17 23:01:08",
  "updateTime": "2020-11-29 21:10:25"
}

TimeResourceDO数据结构参考:

{
  "timetableId": "test_5e2f93818261",
  "weekStartDate": 89,
  "weekOfYear": 80,
  "weekNum": 1,
  "lessonCode": "test_8e463424b9b1",
  "date": 20,
  "fileInfos": [
    {
      "fileName": "test_e2b697819be4",
      "fileCode": "test_b6c34f601983",
      "fileId": "test_469de84fc88a",
      "duration": 95,
      "status": 18,
      "onlineStatus": 7,
      "subjectCode": "test_d48941813229"
    }
  ],
  "subjectCode": "test_263e36c523c6",
  "subjectName": "test_1e38e268f251",
  "teacherUser": "test_5938a6ff97b0",
  "teacherName": "test_65579a61503f",
  "mobile": "test_a9aac5d63aab",
  "schoolId": "test_8f7d77a2542f",
  "schoolName": "test_6f51eb0e4cdc",
  "gradeCode": "test_0bf604459300",
  "id": "test_0346e4939916",
  "createTime": "2015-06-13 00:32:46",
  "updateTime": "2020-02-28 23:55:50"

//查询集合中是否存在,不存在则新增,存在则更新
Criteria criteria = Criteria.where("timetableId").is(vo.getTimetableld())
.and(" weekOfYear").is(DateUtil. getWeekOfYearAtMonday(LocalDate.now())).and("gradeCode") .is(vo.getGradeCode())
.and("lessonCode").is(vo.getLessonCode()).and("weekNum").is(vo.getWeekMum())
.and("date").is(vo.getDate()) ;
if(mongoTemplate.count(Query.query(criteria),TimetableResourceD0.class)> 0){
    List<SectionSourceFileRequestVo> fileList = vo.getFiles();
    List<FileInfo> list = new ArrayList<~>() ;
    fileList.forEach(file ->{
        FileInfo fileInfo = new FileInfo();
        fileInfo.setFileCode(file.getFileCode());
        list.add(fileInfo) ;
    }) ;
    //更新内容
    Update update = new Update();
    Update.AddToSetBuilder f = update.addToSet("fileInfos");
    f.each(list);
    Query upQuery = Query.query(criteria) ;
    mongoTemplate.updatelulti(upQuery,update,   mongoTemplate.getCollectionName(TimetableResourceD0.class));
}
else {
    TimetableResourceD0 resourceD0 = new TimetableResourceDOO;
    resourceD0 = packData(resourceD0, vo);
    mongoTemplate.insert(resourceD0);
}

更新数据:

替换目标位置数据:(替换scheduleLessons集合),使用set、addToSet

ScheduleLesson reqLesson = vo.getScheduleLessons().get(O);
Criteria criteria = new Criteria();
criteria.and("_id").is(new objectId(vo.getTimetableId()))
        .and("gradeTimetables.gradeCode").is(vo.getGradeCode())
        .and("gradeTimetables.scheduleLessons.weekNum ").is(reqLesson.getWeekNum())
        .and("gradeTimetables.scheduleLessons.lessonCode").is(reqLesson.getLessonCode());
Query upQuery = Query. query(criteria);
Update update = new Update().set("updateVersion", oldVersion + 1);
TimetableDO timetableDO =mongoTemplate.findOne(upQuery,TimetableD0.class);
if (objectUtil.isNotEmpty(timetableDO)){
    List<ScheduleLesson> scheduleLessons=timetableDO.getGradeTimetables().stream().
        filter(grade->
                ObjectUtil.equal(grade.getGradeCode(),vo.getGradeCode())
            .findFirst(
                .get().getScheduleLessons();
    scheduleLessons.removeIf(scheduleLesson->
            ObjectUtil.equal(scheduleLesson.getWeekNum(), reqLesson.getWeekNum())
            &&ObjectUtil.equal(scheduleLesson.getLessonCode(),reqLesson.        getLessonCode())));
    ScheduleLesson obj=new ScheduleLesson();
    BeanUtils.copyProperties(reqLesson, obj);
    scheduleLessons.add(obj);
    //更新内容
    update.set("gradeTimetables.$.scheduleLessons", scheduleLessons);    
    mongoTemplate. updateFirst(upQuery,update,mongoTemplate.getCollectionName(TimetableD0.class));
}
else {
    criteria = new Criteria();
    criteria. and("_id").is(new 0bjectId(vo.getTimetableId()))
    .and("gradeTimetables.gradeCode").is(vo.getGradeCode());
    upQuery = Query.query(criteria);
    update.addToSet("gradeTimetables.$.scheduleLessons", reqLesson);
    mongoTemplate.updateMulti(upQuery,update,   mongoTemplate.getCollectionName(TimetableD0.class));
}

查询比较简单就不写了;可以搜索其他文章。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MongoDB复杂Json数据的增删改查 的相关文章

随机推荐

  • Vulhub漏洞靶场搭建和使用

    今天继续给大家介绍渗透测试相关知识 本文主要内容是Vulhub漏洞靶场搭建和使用 免责声明 本文所介绍的内容仅做学习交流使用 严禁利用文中技术进行非法行为 否则造成一切严重后果自负 再次强调 严禁对未授权设备进行渗透测试 一 Vulhub漏
  • 视频播放器测试点

    视频播放器测试点 在负责XX项目组的测试中 接触了好多的关于播放器的测试 基于这些 再结合我测试过程中遇到的问题整理的测试点分别从以下几个方面进行 功能测试 视频资源可以正常获取 不管是服务器返回还是后台添加等 视频的封面图 页面UI等正常
  • 【转载】关于在keil5的time environment没有StdPeriph Drivers(标准库)但是又想使用库函数的解决办法

    关于在keil5的time environment没有StdPeriph Drivers 标准库 但是又想使用库函数的解决办法 本人刚刚接触keil5 遇到了一些问题 希望我的方法能帮到大家 作者本人使用的是芯片是stm32f407VET6
  • SpringBoot配置动态定时任务

    1 配置ScheduledTask 主要是实现SchedulingConfigurer 动态传入cron package com hzl boot config import lombok Data import org springfra
  • Spring Cloud OAuth2(一) 搭建授权服务

    本文内容主要为spring cloud 授权服务的搭建 采用jwt认证 GitHub 地址 https github com fp2952 spring cloud base tree master auth center auth cen
  • [USACO13DEC]Optimal Milking G【线段树维护最大独立集】

    题目链接 P3097 USACO13DEC Optimal Milking G 很明显的是这道题有4e4个点 直接跑最大独立集的话 那么测评机承受不起啊 所以 这里要维护一个区间dp的形式 每个区间有左右两个端点 我们现在要合并两个区间的话
  • HTTP缓存

    HTTP缓存 什么是HTTP缓存 http缓存指的是 当客户端向服务器请求资源时 会先抵达浏览器缓存 如果浏览器有 要请求资源 的副本 就可以直接从浏览器缓存中提取而不是从原始服务器中提取这个资源 常见的http缓存只能缓存get请求响应的
  • Java中的作用域

    目录 Java作用域 Java中变量类型主要有3种 成员变量 静态变量和局部变量 成员变量或方法也有4种作用域 静态修饰符的特点 静态使用的注意事项 静态的优缺点 当成员变量被静态修饰后 和非静态成员变量的区别 方法作用域 块作用域 基本使
  • 单词搜索--回溯算法

    LeetCode 单词搜索 给定一个二维网格 board 和一个字典中的单词列表 words 找出所有同时在二维网格和字典中出现的单词 单词必须按照字母顺序 通过相邻的单元格内的字母构成 其中 相邻 单元格是那些水平相邻或垂直相邻的单元格
  • UIView的setNeedsLayout, layoutIfNeeded 和 layoutSubviews 方法之间的关系解释

    layoutSubviews总结 ios layout机制相关方法 CGSize sizeThatFits CGSize size void sizeToFit void layoutSubviews void layoutIfNeeded
  • 《软件工程教程》(第2版) 主编:吴迪 马宏茹 丁万宁 第十二章课后习题参考答案

    第十二章 软件项目管理 课后习题参考答案 一 简答题 1 项目管理的定义是什么 简述软件项目管理的过程 答 项目管理的定义 项目管理是以项目为对象 通过使用知识 技能 工具和方法来组织 计划 实施并监控项目 使之满足项目目标需求的过程 一般
  • ipad扩展为Windows的第二屏幕【免费无线版】

    本文参考 Ipad扩展为Windows的第二屏幕 有时候想用ipad作为Windows电脑的第二屏幕 那么我们可以通过spacedesk软件进行无线扩展 1 在电脑和ipad上分别下载spacedesk软件 电脑端 ipad 打开ipad
  • npm ERR! tar.unpack untar error

    今天在使用nam install命令安装第三方node模块时 老是出现这样的问题 npm ERR tar unpack untar error tmp npm 5884 e9fda1ac registry npmjs org npm npm
  • cocos creater 鸿蒙 音频卡死 播放失败 不回调

    cocos creater音频播放失败 不回调 卡死 鸿蒙 问题背景 开发过程中 未发现问题 线上 部分鸿蒙用户反馈 页面卡死没反应 页面不能继续下一步 so 问题有可能是 音频没播出来 或者回调没回来 或者 获取音频的时长错误 测试现场1
  • Objects365数据简介及数据转换为XML格式

    Objects365数据简介及数据转换为XML格式 注 Obj365和COCO数据集转换为xml格式以及转为yolo的txt格式 xml数据统计处理更改见GitHub https github com lidc1004 Object det
  • Jmter自动化

    一 接口测试流程 1 拿到api接口文档 熟悉接口业务 2 编写测试用例 正例 正常参数 是否接口正常 反例 鉴权异常情况 参数异常 兼容性 黑名单 调用次数异常 3 使用接口测试用具 Jmeter 4 无人值守 持续集成 输出报告 二 J
  • Cpp学习——模板

    模板 目录 模板 1 介绍 2 函数模板的使用 3 函数模板的强制转换or显式调用 四 模板的分类 1 介绍 在Cpp3 0中 祖师爷便引入了模板的概念 这是一个重大的变革 为后来的Cpp标准化打下了铺垫 也正是因为有了模板 Cpp才能有S
  • 创建阿里云产品和添加设备

    阿里云产品的创建 概述 阿里云网址 https www aliyun com 在线加解密网址 http encode chahuo com MQTT fx下载地址 http mqttfx jensd de 产品创建 一键复制并且保存完毕之后
  • Python爬虫--异常处理

    1 URLError出现的原因 1 连不上服务器 2 远程url不存在 3 无网络 4 触发HTTPError 2 处理异常实例 import urllib request import urllib error try urllib re
  • MongoDB复杂Json数据的增删改查

    本文讲解了MongoDB在java语言下的复杂用法 并附带案例 欢迎各位MongoDB使用者点赞收藏 提出宝贵的意见 TImetableDO数据结构 orgId test 0c8bd2befcae level 33 studyStageCo