IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 大数据 -> Java中MongoDB的mongoTemplate使用(增删改查) -> 正文阅读

[大数据]Java中MongoDB的mongoTemplate使用(增删改查)


注:本文只讲在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的select
Criteria 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查询返回指定字段
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

比如以下:


第一层 
即: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);


讨论

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

总结

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

  大数据 最新文章
实现Kafka至少消费一次
亚马逊云科技:还在苦于ETL?Zero ETL的时代
初探MapReduce
【SpringBoot框架篇】32.基于注解+redis实现
Elasticsearch:如何减少 Elasticsearch 集
Go redis操作
Redis面试题
专题五 Redis高并发场景
基于GBase8s和Calcite的多数据源查询
Redis——底层数据结构原理
上一篇文章      下一篇文章      查看所有文章
加:2021-09-03 11:59:18  更:2021-09-03 11:59:32 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/23 17:19:20-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码