【MongoDB】--MongoDB的crud操作

目录

  • 一、前言
  • 二、对象、数组等的查询
    • 2.1、代码实现示例
  • 三、aggregate查询
  • 四、U(update)操作
    • 4.1、一般的(批量)操作
    • 4.2、数组操作
  • 五、D(delete)操作

一、前言

一般使用mongodb存储非结构化数据,因此,除了常见的数字类型、String等外,还有数组等复杂格式。查询方式有常见对象/数组等查询、aggregate聚合查询,下面将具体介绍各类查询。

二、对象、数组等的查询

elemMatch操作符用于查询数组中满足特定条件的元素。默认情况下,多条件查询一个数组。文档内的数组一个元素满足所有条件,也可以是每个元素只满足一部分条件但加起来满足所有条件。使用$elemMatch操作符表示要求数组中至少一个元素满足所有条件。

2.1、代码实现示例

  /*** 基本的查询,针对各种对象、数据结构类型,find()查询方式* @param param* @return*/public Object baseQuery(KnowledgeVo param){Criteria criteria = new Criteria();criteria.and("tenantsid").is(563651117638208L);//模糊匹配
//        Pattern pattern = Pattern.compile("^.*" + param.getKnowledgeName() + ".*$", Pattern.CASE_INSENSITIVE);
//        criteria.and("knowledge_name").is(pattern);//范围查询if(StringUtils.isBlank(param.getQueryStartTime()) && StringUtils.isNotBlank(param.getQueryEndTime())){criteria.and("update_time").lte(TimeUtil.parseDatetime(param.getQueryEndTime()));}if(StringUtils.isNotBlank(param.getQueryStartTime()) && StringUtils.isBlank(param.getQueryEndTime())){criteria.and("update_time").gte(TimeUtil.parseDatetime(param.getQueryStartTime()));}if(StringUtils.isNotBlank(param.getQueryStartTime()) && StringUtils.isNotBlank(param.getQueryEndTime())){criteria.and("update_time").gte(TimeUtil.parseDatetime(param.getQueryStartTime())).lte(TimeUtil.parseDatetime(param.getQueryEndTime()));}//String数组的匹配查询//      criteria.and("file_info").in(param.getFileInfo());/**"knowledge_customize" : {"is_current_step_skip" : "2","question_basic_info" : [{"project_stage_no" : "1"}]}*///对象的匹配查询【简单格式的】 knowledge_customize是对象,is_current_step_skip是String类型//     criteria.and("knowledge_customize.is_current_step_skip").is("2");//特别字段的查询【数组查询】, question_basic_info是knowledge_customize对象的数组字段,project_stage_no又是数组的Bean对象的一个字段//      criteria.and("knowledge_customize.question_basic_info.project_stage_no").in("1");//使用elemMatch查询数组criteria.andOperator( Criteria.where("knowledge_customize.question_basic_info").elemMatch(Criteria.where("project_stage_no").is("1")));/**"field_list" : [{"qa_type" : "question","field_name" : "标准答案"},{"qa_type" : "answer","field_name" : "问题描述"}]----针对数组,使用$elemMatch是用来查询*/
//        Pattern pattern = Pattern.compile("^.*" + param.getKnowledgeName() + ".*$", Pattern.CASE_INSENSITIVE);
//          //模糊匹配,覆盖多个字段去模糊匹配
//        criteria.orOperator(
//                Criteria.where("template_name").is(pattern),
//                Criteria.where("knowledge_model_name").is(pattern),
//                Criteria.where("field_list").elemMatch(
//                        Criteria.where("qa_type").in("answer", "question", "key_point") //数组中,A字段满足某个条件
//                                .and("field_name").regex(pattern)));Query query = new Query(criteria);List<KnowledgeDoc> docList = mongoTemplate.find(query,KnowledgeDoc.class,"wwy_knowledge");return docList;}

三、aggregate查询

可以参考mongodb集成aggregate查询

四、U(update)操作

4.1、一般的(批量)操作

/*** 修改数据* @return*/
public UpdateResult update(){Query query = new Query();query.addCriteria(Criteria.where("_id").is("0001"));Update update = new Update();update.set("name","www11back");update.set("age",10);update.set("sex",1);UpdateResult result =  mongoTemplate.updateFirst(query,update,"w_test1");System.out.println("update result:"+result);//update result:AcknowledgedUpdateResult{matchedCount=1, modifiedCount=1, upsertedId=null}return result;
}/*** 批量更新的操作* @return*/
public int batchUpdate(){List<StudentDo> list = new ArrayList<>(); //要修改的一批数据List<Pair<Query, Update>> updateList = new ArrayList<>(list.size());BulkOperations operations = mongoTemplate.bulkOps(BulkOperations.BulkMode.UNORDERED, "w_test1");list.forEach(data -> {//如果query查询到有数据就更新Query query = new Query(new Criteria("_id").is(data.getId()));Update update = new Update();update.set("stu_name",data.getStuName());update.set("updateTime",data.getUpdateTime());Pair<Query, Update> updatePair = Pair.of(query, update);updateList.add(updatePair);});operations.upsert(updateList);BulkWriteResult result = operations.execute();return result.getModifiedCount();
}

4.2、数组操作

数组更新操作符(Array Update Operators)

$ 占位符,只更新符合条件的文档的数组字段中的第一个匹配的元素。 下文有demo。
$[] 占位符,和$的区别是更新符合条件的文档的数组字段中的所有元素。
$[<identifier>] 也是占位符,但是只更新符合条件的文档的数组中的指定元素(符合某个条件)。 要和update中的第三个参数中的可选项 arrayFilters配合使用。
$addToSet,添加元素到一个数组,确保不重复(set)。如果数组中没有一模一样的元素,可以插入,如果有,则无法插入。
$pop 删除数组第一个或者最后一个元素。
$pull 删除数组中所有符合指定条件的元素。
$push 添加一个元素到数组中。
$pullAll 删除数组中的所有元素。

五、D(delete)操作

mongoTemplate原生态的delete方法,主要有以下几种。
DeleteResult remove(Object var1);
DeleteResult remove(Object var1, String var2);
DeleteResult remove(Query var1, String var2);
DeleteResult remove(Query var1, Class<?> var2); DeleteResult remove(Query var1, Class<?> var2, String var3);

   public Long testDelete() {ContentDoc doc = new ContentDoc ();doc.setId(new ObjectId("6475c519a2ad8619883aa9d8"));//       DeleteResult de = mongoTemplate.remove(doc); //  DeleteResult remove(Object var1);//       DeleteResult de = mongoTemplate.remove(doc,"wwy_content"); //   DeleteResult remove(Object var1, String var2);Query query = new Query(Criteria.where("_id").in(new ObjectId("64772716cdea002184353fb1"),new ObjectId("6475d858a2ad8654bc6be713")));
//        DeleteResult de = mongoTemplate.remove(query, ContentDoc .class); //DeleteResult remove(Query var1, Class<?> var2);DeleteResult de = mongoTemplate.remove(query, ContentDoc .class,"wwy_content"); // DeleteResult remove(Query var1, Class<?> var2, String var3);//      DeleteResult de = mongoTemplate.remove(query, "wwy_content"); // DeleteResult remove(Query var1, String var2);System.out.println("de:"+de.getDeletedCount()); //de:AcknowledgedDeleteResult{deletedCount=1}return de.getDeletedCount();}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/230467.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Java 基础学习(九)API概述、Object、String、正则表达式

1 API概述 1.1 API概述 1.1.1 什么是API API(Application Programming Interface)&#xff0c;意为&#xff1a;应用程序接口。API就是已经写好的的程序或功能&#xff0c;程序要需要时可以直接调用&#xff0c;无需再次编写。 API可以大致分为如下几类&#xff1a; 编程语…

vue + element 实现鼠标左右滑动效果

我用了element中的走马灯&#xff0b;overflow-x: auto; html &#xff08;复制后格式化一下&#xff09; <div class"scroll" id"entrance"><el-carousel height"150px" :autoplay"false" :loop"false" arrow&q…

美创“四大能力”为工业企业数据安全构筑韧性防线

12月14日&#xff0c;“数据与网络安全创新 赋能工业企业数字化转型”主题沙龙在杭州举行。本次活动由浙江省工业软件产业技术联盟、浙江省网络空间安全创新研究中心、浙江省图灵互联网研究院主办&#xff0c;浙江省网络空间安全协会数据安全治理专委会、杭州市计算机学会、长三…

华硕天选大小核设置

电脑:华硕天选4, CPU:13th Gen Intel(R) Core(TM) i9-13900H 2.60 GHz在奥创智控中心(Armoury Crate)调整大小核,应用重启即可

代码随想录算法训练营第41天|● 343. 整数拆分 ● 96.不同的二叉搜索树

343. 整数拆分 已解答 中等 相关标签 相关企业 提示 给定一个正整数 n &#xff0c;将其拆分为 k 个 正整数 的和&#xff08; k > 2 &#xff09;&#xff0c;并使这些整数的乘积最大化。 返回 你可以获得的最大乘积 。 示例 1: 输入: n 2 输出: 1 解释: 2 1 1, 1 1 …

海思平台isp之raw图回灌调试

文章目录 一、搭建环境二、配置参数三、回灌raw图isp调试中,经常会遇到一些特定场景的效果需要优化,但由于某些原因和成本考虑,开发人员无法亲临现场,这个时候采集场景raw图回灌到板端调试,就显得尤为方便了。 一、搭建环境 (1)建立板端与PQTool连接 板端进入SS928V100…

如何使用Idea生成war包-创建工件

目录 1、创建展开型的&#xff0c;路径为&#xff1a; 2、创建存档型的&#xff0c;路径为&#xff1a; 1、创建展开型的&#xff0c;路径为&#xff1a; 文件->项目结构->项目设置->工件->【】->【Web应用程序:展开型】->【基于模块】 将右边的可用元素&…

zip的binaries和selfcontained的区别是什么

在hub/ee里我们有时候看到不同后缀的压缩包, 具体差别如下: 前者是纯粹的ILSpy二进制文件&#xff0c;需要手动解压缩后运行&#xff1b; 后者则是一个自包含的应用程序&#xff0c;包括了.NET Core运行时和所有依赖组件&#xff0c;可以直接运行。

架构设计系列之架构文化建设和遵循定律

这一部分我们一起来聊聊架构文化建设部分的内容。这里是涉及到对架构师的一些软实力和文化要求的部分&#xff0c;会从组织文化和架构设计中常见定律两部分来逐一讲解。 当我们说到软件架构时&#xff0c;不仅仅是指技术上的设计和决策&#xff0c;更涉及到组织的文化和价值观…

带你了解OpenCV4工业缺陷检测的六种方法

文章目录 OpenCV4工业缺陷检测的六种方法机器视觉缺陷检测1. 工业上常见缺陷检测方法方法一&#xff1a;基于简单二值图像分析实现划痕提取&#xff0c;效果如下&#xff1a;方法二&#xff1a;复杂背景下的图像缺陷分析&#xff0c;基于频域增强的方法实现缺陷检测&#xff0c…

vscode使用remote ssh到server上 - Node进程吃满CPU

起因&#xff1a;Node进程吃满CPU 分析 我发现每次使用vscode的remote插件登陆到server后&#xff0c;就会出现node进程&#xff0c;不太清楚干什么用的&#xff0c;但是绝对和它有关。 查找原因 首先找到了这篇文章&#xff0c;解决了rg进程的问题&#xff1a; https://blo…

docker 与 ffmpeg

创建容器 docker run -it -v /mnt/f/ffmpeg:/mnt/f/ffmpeg --name ffmpeg 49a981f2b85f /bin/bash 在 Linux 上编译 FFmpeg&#xff1a; 安装依赖库&#xff1a; sudo apt-get update sudo apt-get install build-essential yasm cmake libtool libc6 libc6-dev unzip wget下…

JVM日常故障排查小结

前置知识 jstack简介 jstack是JVM自带的工具&#xff0c;用于追踪Java进程线程id的堆栈信息、锁信息&#xff0c;或者打印core file&#xff0c;远程调试Java堆栈信息等。 而我们常用的指令则是下面这条: # 打印对应java进程的堆栈信息 jstack [ option ] pid option常见选…

计算智能 | 粒子群算法

一、寻找非线性函数的最大值 这里我们使用python来求解《MATLAB智能算法30个案例分析》种第13章的内容。 我们使用基本粒子群算法寻找非线性函数 的最大值。 在Python程序中&#xff0c;我们规定粒子数为20&#xff0c;每个粒子的维数为2&#xff0c;算法迭代进化次数为300&…

I/O模型及相似概念

I/O I/O&#xff08;输入/输出&#xff09;模型是计算机系统中用于处理输入和输出操作的方法。在计算机程序中&#xff0c;I/O操作通常涉及与外部设备&#xff08;如硬盘、网络、键盘、显示器等&#xff09;的数据交互。不同的I/O模型采用不同的方式来处理这些数据交互&#x…

一文带你了解Pytest..

在之前的文章里我们已经学习了Python自带测试框架UnitTest&#xff0c;但是UnitTest具有一定的局限性 这篇文章里我们来学习第三方框架pytest&#xff0c;它在保留了UnitTest框架语法的基础上有着更多的优化处理 下面我们将从以下角度来介绍Pytest&#xff1a; Pytest基本介绍…

GDB Tutorial

背景&#xff1a; 最近在重新学习操作系统&#xff0c;顺带重学一下C语言&#xff0c;GDB是C语言进行调试的工具&#xff0c;也就重新学一下GDB&#xff0c;本文没有什么创新只是记录所学内容&#xff0c;供以后翻阅和查询。 一、首先需要安装一系列软件 apt-get install bui…

按摩师(空间优化的动态规划算法)

一个有名的按摩师会收到源源不断的预约请求&#xff0c;每个预约都可以选择接或不接。在每次预约服务之间要有休息时间&#xff0c;因此她不能接受相邻的预约。给定一个预约请求序列&#xff0c;替按摩师找到最优的预约集合&#xff08;总预约时间最长&#xff09;&#xff0c;…

Typora+Picgo(正常) 却上传图片失败问题解决思路和办法

报错信息 在typora中粘贴图片时报错&#xff0c;显示上传图片失败&#xff0c;有点奇怪&#xff0c;而我确定我的picgo正常且通过了测试&#xff0c;那我们就去看日志&#xff0c;跟踪排查问题在哪里 我的picgo日志文件路径在 D:\user\username\Application Data\picgo\picg…

Linux下Netty实现高性能UDP服务

前言 近期笔者基于Netty接收UDP报文进行业务数据统计的功能&#xff0c;因为Netty默认情况下处理UDP收包只能由一个线程负责&#xff0c;无法像TCP协议那种基于主从reactor模型实现多线程监听端口&#xff0c;所以笔者查阅网上资料查看是否有什么方式可以接收UDP收包的性能瓶颈…