首页 > 数据库 >Java中MongoDB的mongoTemplate使用(增删改查)

Java中MongoDB的mongoTemplate使用(增删改查)

时间:2023-08-27 15:05:34浏览次数:45  
标签:Java MongoDB sum 改查 query text Query opId options

注:本文只讲在java中的使用,并且只简单讲一下本人在开发中遇到的一部分 并不完全概括 在cmd中的请自行查看其他博主.

简单

准备:

想用它就得引入它:

<dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>


在service中
    @Resource
    private MongoTemplate mongoTemplate;
    所有的方法都在mongoTemplate中

查询:

Criteria criteria = new Criteria();
       
        String name = jsonObject.getString("name");
        //模糊查询
        if(name != null){
            criteria.and("name").regex(".*?" + name + ".*?");
        }

        //排序
        Query query = new Query(criteria).with(Sort.by("createDate"));
        //开启分页
        mongoUtil.start(page, limit, query);
        //获取条数
        long count = mongoTemplate.count(query, Template.class);
        //分页数据
        PageHelper<Template> pageHelper = mongoUtil.pageHelper(count, mongoTemplate.find(query, Template.class));

删除:

//先查询出来数据 这里的is(id)可以改成in(ids) 即为批量删除
 Query query = new Query(Criteria.where("dataId").is(id));
 //再根据查询删除       
 return mongoTemplate.remove(query, Question.class);

增加:

实体类 newTemplate = new 实体类(字段1,字段2,...字段last);
//可以不需要先在数据库中创建,调用insert方法时 没有会自动创建
mongoTemplate.insert(newTemplate, "文档名即表名");

修改:

Query query = new Query(Criteria.where("_id").is(id));
  实体类 实体 = mongoTemplate.findOne(query, 实体类.class);
  //不存在数据就不要往下走了
  if(实体  == null){
     return 该数据为空或已被删除;
   }
   Update update = new Update();
   update.set("title", jsonObject.getString("title"));
   //最后一次修改时间
   update.set("updateDate", Date());
   mongoTemplate.updateFirst(query, update, 实体类.class);

思路

Query query = new Query() 相当于mysql的selectCriteria criteria = new Criteria();里的criteria 相当于where后的条件实体类相当于表名上面的理解就相当于select * from table where xxxx MongoDb的增删改查都要调用Query query = new Query()

进阶:

上面的有手就行,下面是稍微复杂点的

查询(指定字段过滤)

如果不指定的话 每次查询其实都是select * ,一堆数据占用资源.实际上你只需要某个或者某些字段


 Query query = new Query(Criteria.where("questId").is(quId));

// query.fields().include("_id","quesTitle","createDate"); //包含该字段
  query.fields().exclude("questions");//不包含该字段
   实体类 实体= mongoTemplate.findOne(query, 实体类.class);

这个过滤我找了好久: 讲实话 抄来抄去的没有能用的就这个可以

参照: MongoTemplate查询返回指定字段

Java中MongoDB的mongoTemplate使用(增删改查)_字段

Java中MongoDB的mongoTemplate使用(增删改查)_数据_02

Java中MongoDB的mongoTemplate使用(增删改查)_实体类_03

Java中MongoDB的mongoTemplate使用(增删改查)_数据_04

Java中MongoDB的mongoTemplate使用(增删改查)_数据_05

Java中MongoDB的mongoTemplate使用(增删改查)_字段_06

亲测有效 不过以上方法只支持第一层过滤,就是你文档的第一层,如果你想过滤字段的数组的某个对象 我没做到,如果你做到了,教教我 求求了

比如以下:

第一层 
即:quesTitle,endDate,count,questions,createDate,status,startDate
都可以过滤掉或者指定显示,但是questions中的total,options过滤不掉
questions中的options中的opId,sum,text更过滤不掉.
有会的 跪求你教我

{
	"quesTitle": "这是一个测试问卷",
	"endDate": "2021-08-30T17:21:21.247+08:00",
	"count": 19,
	"questions": [
		{
			"total": 2,
			"options": [
				{
					"opId": "1427545472754651136",
					"sum": 2,
					"text": "男"
				}
			],
			"title": "问题1",
			"quesId": "1419934979261075457"
		},
		{
			"total": 3,
			"options": [
				{
					"opId": "142754547275465116",
					"sum": 2,
					"text": "女"
				},
				{
					"opId": "1428872",
					"sum": 1,
					"text": "未知"
				}
			],
			"title": "您的性别",
			"quesId": "1430722700409704450"
		},
		{
			"total": 4,
			"options": [
				{
					"opId": "1432600351034445824",
					"sum": 2,
					"text": "0-2"
				},
				{
					"opId": "1432600351034445825",
					"sum": 1,
					"text": "2-5"
				},
				{
					"opId": "1432600351034445826",
					"sum": 1,
					"text": "5-10"
				},
				{
					"opId": "1432600351034445827",
					"sum": 1,
					"text": "10+"
				}
			],
			"title": "你的工作年限",
			"quesId": "1432600351034445828"
		},
		{
			"total": 4,
			"options": [
				{
					"opId": "1432600445817327616",
					"sum": 2,
					"text": "篮球"
				},
				{
					"opId": "1432600445817327617",
					"sum": 1,
					"text": "打游戏"
				},
				{
					"opId": "1432600445817327618",
					"sum": 1,
					"text": "睡觉"
				}
			],
			"title": "您的兴趣爱好",
			"quesId": "1432600445817327619"
		},
		{
			"total": 6,
			"options": [
				{
					"opId": "14288721111",
					"sum": 6,
					"text": "test"
				}
			],
			"title": "问题3",
			"quesId": "12345678"
		}
	],
	"startDate": "2021-08-30T17:21:21.247+08:00",
	"status": 1,
	"createDate": "Mon Aug 30 17:21:21 CST 2021"
}

修改(多层数组精确修改)

比如以上文档 你可以修改questions下的指定quesId的同级参数如title,total
Query qu = new Query(Criteria.where("_id").is(id).and("questions.quesId").is(quesId));
	Update update = new Update();
    update.set("options.$.title", title);
    mongoTemplate.updateFirst(qu, update, 实体类.class);
修改第二层 这个没有问题

好 然后你又想修改第三层 即:questions下的options下的某个参数如sum,text
或许你想根据上面的写法
Query qu = new Query(Criteria.where("_id").is(id).and("questions.quesId").is(quesId).and("questions.options.opId").is(opId));
	Update update = new Update();
    update.set("options.$.options.text", text);
    mongoTemplate.updateFirst(qu, update, 实体类.class);
    不好意思 这样的写法 你只能修改questions[0].options[0]
    如果你直接拿第一条数据测没问题了 就觉得没问题了提交代码上线 那你GG了.

	 要这样写:
	 int y = -1;
     int z = -1;
     for (int i1 = 0; i1 < list.size(); i1++) {
         if(quesId.equals(list.get(i1).getQuesId())){
             y = i1;
             List<Option> list1 = list.get(i1).getOptions();
             for(int i2 = 0; i2 < list1.size(); i2++){
                 if(opId.equals(list1.get(i2).getOpId())){
                     z = i2;
                     break;
                 }
             }
             break;
         }
     }
     if(y == -1 || z == -1){
         return "代码错误!出bug了";
     }
	 y
	 z
	 用来遍历确定要修改的questions中的第 y 个options,
	 第 y 个options中的第 z 个 sum 下标从0开始
     update.inc("questions."+y+".options."+z+".sum",1);
     update.set("questions."+y+".options."+z+".text",text);

讨论

当然以上方法本人迂回的思路 并不确定有没有更好的方法 毕竟遍历有消耗,多数据时很拉跨 如大佬有更好的方法 求你教我

总结

暂时先写这么多吧,其实怎么做都是围绕着数据,对数据的增删改查. 除了增删改查就是让程序更好的增删改查.

标签:Java,MongoDB,sum,改查,query,text,Query,opId,options
From: https://blog.51cto.com/u_16238347/7252404

相关文章

  • Mongodb 笔记
    MongoDb:非关系型数据库,基于分布式文件存储的开源数据库系统,在高负载的情况下,添加更多的节点,可以保证服务器的性能MongoDB操作 文档的数据结构和JSON基本一样。所有存储在集合中的数据都是BSON格式。BSON是一种类似JSON的二进制形式的存储格式,是BinaryJSON的......
  • 9、使用Java的方式配置Spring
    9、使用Java的方式配置Spring我们现在完全不需要Spring的xml配置文件了,全权交给Java来做Javaconfig是Spring的一个子项目,在Spring4之后他成为了一个核心功能使用纯Java的方式来配置Spring需要有一个配置类packagecom.an.Config;importcom.an.pojo.User;importorg.springfra......
  • 使用 XStream实现JavaBean 与 XML/JSON 之间相互转换
    XML和JSON是当今常用的两种数据描述与传输的格式,特别是涉及到JS时使用JSON颇为频繁。自然,在Java的世界里少不了完成JavaBean与这两种格式相互转换的组件,那就是XStream和JSON-lib。这里我简单记下XStream的用法。其实相类似的工具早已有之。如果用过DWR的同志,一定有印像,DWR进行远程......
  • JavaMail配置SSL服务器及安装证书
    客户给的邮件服务器要SSL,使用Spring的JavaMailSenderImpl,Spring配置如下<beanid="javaMailSender"class="org.springframework.mail.javamail.JavaMailSenderImpl"><propertyname="host"value="${mail.smtp.host}"/>......
  • java 正则表达式 非捕获组(特殊构造)
    针对JavaAPI文档中的正则表达式关于特殊构造(非捕获组)的说明,例如:1.(?:X)X,asanon-capturinggroup2.(?idmsux-idmsux) Nothing,butturnsmatchflagson-off3.(?idmsux-idmsux:X)  X,asanon-capturinggroupwiththegivenflagson-off4.(?=......
  • 《突击面试》JavaPub版
    突击面试题汇总持续更新中...《突击面试》(点击阅读)【JVM】10道不得不会的JVM面试题(点击阅读)10道不得不会的Zookeeper面试题(点击阅读)10道不得不会的MyBatis面试题(点击阅读)10道不得不会的缓存面试题【缓存】(点击阅读)10道不得不会的JavaEE(点击阅读)【Kafka】10......
  • JavaScript的变量提升
    参考资料:https://time.geekbang.org/column/article/126339目录变量提升变量形式声明的函数变量提升导致的问题变量被覆盖变量不被销毁避开变量提升引入let和const关键字块级作用域变量提升是在代码执行时,把变量和函数的声明部分提升到代码开头的行为,变量被提升后,会被默认设置......
  • hibernate——简单的增删改查
    增删改比较简单,查稍微复杂一点。查询有两种方式,一种是通过hql语句和Query接口来实现,一种是条件查询,通过Ctiteria接口来实现,下面举例说明:UserDao接口:packagecom.suo.hibernate.dao;importjava.util.List;importcom.suo.domain.User;publicinterfaceUserDao{ publicv......
  • Java使用Jsch执行Shell命令
    JSch是SSH2的纯Java实现。JSch允许您连接到sshd服务器并使用端口转发,X11转发,文件传输等,您可以将其功能集成到您自己的Java程序中。JSch获得BSD格式许可证。最初,我们开发这些东西的动机是允许我们的纯JavaX服务器WiredX的用户享受安全的X会话。所以,我们的努力主要是为了实现用......
  • 使用 Java 生成二维码图片
    0x01准备(1)软件版本IntelliJIDEA2023.1.3JDK18Tomcat10.1.11Maven3.8.6(2)技术栈servletzxing谷歌项目生成黑白二维码并可以附上logoqrcodegithub开源项目基于并拓展zxing(3)创建项目创建空项目在菜单栏-文件-项目结构中设置JDK及语言级别......