SpringBoot整合MongoDB文档相关操作

文章目录

  • SpringBoot整合MongoDB
  • 文档操作
    • 添加文档
    • 查询文档
    • 更新文档
    • 删除文档

SpringBoot整合MongoDB

  1. 创建项目,添加依赖,配置连接

    <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-mongodb</artifactId>
    </dependency>
    <dependency><groupId>org.projectlombok</groupId><artifactId>lombok</artifactId><version>1.18.32</version>
    </dependency>
    
    spring:data:mongodb:
    #      uri: mongodb://xxx:xxx@192.168.1.x:27017/database_name?authSource=adminhost: 192.168.1.xport: 27017username: xxxpassword: xxxdatabase: mydatabase_nameauthentication-database: admin
    
  2. 连接测试

     @Resource
    MongoTemplate mongoTemplate;/*** 连接测试*/
    @Test
    public void testConnection(){MongoDatabase mongoDatabase = mongoTemplate.getDb();System.out.println("Connected to database: " + mongoDatabase.getName());// 获取所有集合的名称并打印mongoDatabase.listCollectionNames().forEach(collectionName -> {System.out.println("Collection: " + collectionName);});
    }
    
  3. 集合操作

    /*** 创建集合测试*/
    @Test
    public void testCreateCollection(){boolean exists = mongoTemplate.collectionExists("emp");if (exists){mongoTemplate.dropCollection("emp");}mongoTemplate.createCollection("emp");
    }
    

文档操作

注解描述示例
@Document标识一个类为MongoDB的文档,并指定集合名@Document(collection="users")
@Id标识一个字段为文档的唯一标识符(_id)@Id private String id;
@Field指定字段在MongoDB中的名称@Field("user_name") private String username;
@Indexed为字段创建索引@Indexed private String email;
@CompoundIndex创建复合索引@CompoundIndex(name="name_age", def="{'firstName': 1, 'age': -1}")
@TextIndexed为字段创建文本索引@TextIndexed private String description;
@Transient标识字段不被持久化到数据库@Transient private String tempField;
@DBRef引用另一个文档@DBRef private List<Role> roles;
@Version用于乐观锁,自动处理版本控制@Version private Long version;
@CreatedDate自动记录文档的创建时间@CreatedDate private Date createdDate;
@LastModifiedDate自动记录文档的最后修改时间@LastModifiedDate private Date lastModifiedDate;
  • 详细解说
  1. @Document

    • 用于标识一个Java类为MongoDB的文档,并可以指定集合名称。如果不指定集合名称,默认使用类名的小写形式。
    • 示例:@Document(collection="users")
  2. @Id

    • 用于标识一个字段为文档的唯一标识符(_id)。通常映射到MongoDB的_id字段。
    • 示例:@Id private String id;
  3. @Field

    • 用于指定字段在MongoDB中的名称。如果不使用此注解,字段名称默认与Java类中的字段名称一致。
    • 示例:@Field("user_name") private String username;
  4. @Indexed

    • 用于为字段创建索引,可以提高查询效率。可以通过参数指定索引类型和方向。
    • 示例:@Indexed private String email;
  5. @CompoundIndex

    • 用于创建复合索引,可以提高多字段查询的效率。
    • 示例:@CompoundIndex(name="name_age", def="{'firstName': 1, 'age': -1}")
  6. @TextIndexed

    • 用于为字段创建文本索引,支持全文搜索。
    • 示例:@TextIndexed private String description;
  7. @Transient

    • 用于标识字段不被持久化到数据库。
    • 示例:@Transient private String tempField;
  8. @DBRef

    • 用于引用另一个文档,类似于关系数据库的外键。
    • 示例:@DBRef private List<Role> roles;
  9. @Version

    • 用于乐观锁,自动处理版本控制。每次更新文档时,版本号会自动增加。
    • 示例:@Version private Long version;
  10. @CreatedDate

    • 自动记录文档的创建时间。
    • 示例:@CreatedDate private Date createdDate;
  11. @LastModifiedDate

    • 自动记录文档的最后修改时间。
    • 示例:@LastModifiedDate private Date lastModifiedDate;

添加文档


// 1. 选择数据库 (如使用 'test' 数据库)
use mydatabase// 2. 创建 emp 集合并插入文档
db.emp.insertOne({_id:10,               name: "John Doe",age: 30,salary: 55000.00,birthday: new Date("1992-05-15")
})// 3. 也可以插入多个文档
db.emp.insertMany([{_id:20name: "Jane Smith",age: 25,salary: 60000.00,birthday: new Date("1997-08-23")},{_id:30name: "Alice Johnson",age: 27,salary: 65000.00,birthday: new Date("1995-03-12")}
])// 4. 查询集合中的所有文档以验证插入是否成功
db.emp.find().pretty()
  • insert方法返回值是新增的Document对象,里面包含了新增后id的值。如果集合不存在会自动创建集合。
  • 通过Spring Data MongoDB会给集合中多加一个class的属性,存储新增时Document对应Java中类的全限定路径。原因为了查询时能把Document转换为Java类型。
@Document("emp") //对应emp集合中的一个文档
@Data
@AllArgsConstructor
@NoArgsConstructor
public class Employee {@Idprivate Integer id;@Fieldprivate String name;@Fieldprivate int age;@Fieldprivate Double salary;@Fieldprivate Date birthday;
}
 /*** 添加文档*/@Testpublic void testInsert(){Employee employee = new Employee(1, "小明", 30,10000.00, new Date());//insert:_id存在抛出异常 支持批量操作mongoTemplate.insert(employee);//sava:_id存在时更新数据mongoTemplate.save(employee);//插入多条数据List<Employee> list = Arrays.asList(new Employee(2,"张三", 21,5000.00, new Date()),new Employee(3,"李四",26,8000.00, new Date()),new Employee(4, "王五",22, 8000.00, new Date()),new Employee(5,"张龙",28,6000.00, new Date()),new Employee(6,"赵虎",24,7000.00, new Date()),new Employee(7,"赵六",28,12000.00, new Date()));Collection<Employee> employees = mongoTemplate.insert(list, Employee.class);System.out.println(employees);}

在这里插入图片描述

查询文档

  • Criteria是标准查询的接口,可以引l用静态的criteria.where的把多个条件组合在一起,就可以轻松地将多个方法标准和查询连接起来,方便操作查询语句

  • MongoDB 中 Criteria 查询标准的表格:

Criteria 语法MongoDB 中的语法说明
Criteria.where(String key){ key: ... }创建一个以指定键为目标的查询条件。
Criteria.andOperator(Criteria... criteria)$and创建一个并且(AND)组合查询条件。
Criteria.orOperator(Criteria... criteria)$or创建一个或者(OR)组合查询条件。
Criteria.is(Object value)key: value等于指定值。
Criteria.ne(Object value)key: { $ne: value }不等于指定值。
Criteria.lt(Object value)key: { $lt: value }小于指定值。
Criteria.lte(Object value)key: { $lte: value }小于或等于指定值。
Criteria.gt(Object value)key: { $gt: value }大于指定值。
Criteria.gte(Object value)key: { $gte: value }大于或等于指定值。
Criteria.in(Object... values)key: { $in: [values...] }在指定的值列表中。
Criteria.nin(Object... values)key: { $nin: [values...] }不在指定的值列表中。
Criteria.regex(String regex)key: { $regex: regex }匹配指定的正则表达式。
Criteria.exists(boolean exists)key: { $exists: exists }检查字段是否存在。
Criteria.type(int type)key: { $type: type }检查字段的 BSON 类型。
Criteria.elemMatch(Criteria criteria)key: { $elemMatch: {...} }匹配数组中的元素。
Criteria.size(int size)key: { $size: size }检查数组的长度。
Criteria.not()key: { $not: {...} }否定条件。
Criteria.mod(Number value, Number remainder)key: { $mod: [value, remainder] }按指定值取模。
Criteria.all(Object... values)key: { $all: [values...] }数组包含所有指定的元素。
Criteria.within(Shape shape)key: { $geoWithin: {...} }地理空间查询,检查点是否在指定的形状内。
Criteria.near(Point point)key: { $near: {...} }地理空间查询,查找接近指定点的文档。
  • 示例解释:

  • Criteria.andOperator:

Criteria 语法:

Criteria criteria = new Criteria();
criteria.andOperator(Criteria.where("age").gt(25), Criteria.where("salary").lt(60000));

MongoDB 语法:

{"$and": [{ "age": { "$gt": 25 } },{ "salary": { "$lt": 60000 } }]
}
  • Criteria.orOperator:

Criteria 语法:

Criteria criteria = new Criteria();
criteria.orOperator(Criteria.where("status").is("Active"), Criteria.where("status").is("Pending"));

MongoDB 语法:

{"$or": [{ "status": "Active" },{ "status": "Pending" }]
}

说明:

  • Criteria 类用于构建复杂的查询条件。
  • MongoDB 对应语法中,条件操作符通常以 $ 开头,例如 $and, $or, $gt, $lt 等。
  • 使用 Criteria 类可以链式调用,方便地组合多种条件,生成复杂的查询语句。
 	/*** 查询文档*/@Testpublic void SelectTest() {//查询所有数据List<Employee> all = mongoTemplate.findAll(Employee.class);System.out.println(all);//查询id=1的数据Employee employee = mongoTemplate.findById(1, Employee.class);System.out.println(employee);//无条件查询Employee one = mongoTemplate.findOne(new Query(), Employee.class);System.out.println(one);//查询薪资大于8000的员工Query condition1 = new Query(Criteria.where("salary").gte(8000));System.out.println(mongoTemplate.find(condition1, Employee.class));//查询姓张的员工Query condition2 = new Query(Criteria.where("name").regex("^张"));System.out.println(mongoTemplate.find(condition2, Employee.class));//查询姓张并且薪资大于5000的员工Criteria criteria = new Criteria();criteria.andOperator(Criteria.where("name").regex("^张"),Criteria.where("salary").gt(5000));Query query = new Query(criteria);query.with(Sort.by(Sort.Order.asc("name")));List<Employee> employeeList = mongoTemplate.find(query, Employee.class);employeeList.forEach(System.out::println);}
	@Testpublic void testFindBuJson(){String json="{name:'张三'}";BasicQuery query = new BasicQuery(json);mongoTemplate.find(query,Employee.class).forEach(System.out::println);String json2="{$or: [{age:{$gt:25}},{salary:{$gte:8000}}]}";BasicQuery query2 = new BasicQuery(json2);mongoTemplate.find(query2,Employee.class).forEach(System.out::println);}

更新文档

  • 在Mongodb中无论是使用客户端APl还是使用SpringData,更新返回结果一定是受行数影响。如果更新后的结果和更新前的结果是相同,返回0。
  • updateFirst():只更新满足条件的第一条记录
  • updateMulti():更新所有满足条件的记录
  • upsert():没有符合条件的记录则插入数据
	/*** 更新文档*/@Testpublic void testUpdate(){//query设置查询条件Query query = new Query(Criteria.where("salary").gte(5000));System.out.println("更新前");List<Employee> employees = mongoTemplate.find(query, Employee.class);employees.forEach(System.out::println);//设置更新属性Update update = new Update();update.inc("salary",3000); //加工资//update.inc("salary",-3000); //减工资//只更新满足条件的第一条记录//mongoTemplate.updateFirst(query,update, Employee.class);//更新满足条件的多条记录mongoTemplate.updateMulti(query,update, Employee.class);//upsert 没有符合条件则插入数据Query query2 = new Query(Criteria.where("id").is(12));Update update2 = new Update();update2.setOnInsert("salary",8000);update2.setOnInsert("name","小龙");update2.setOnInsert("age",23);UpdateResult updateResult = mongoTemplate.upsert(query2, update2, Employee.class);//返回修改的记录数System.out.println(updateResult.getModifiedCount());}

删除文档

	/*** 删除文档*/@Testpublic void testDelete(){//条件删除Query query = new Query(Criteria.where("id").is(12));mongoTemplate.remove(query,Employee.class);//删除所有文档mongoTemplate.dropCollection("emp"); //推荐//mongoTemplate.remove(new Query(), Employee.class); //不推荐}

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

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

相关文章

Python 数据容器的对比

五类数据容器 列表&#xff0c;元组&#xff0c;字符串&#xff0c;集合&#xff0c;字典 是否能下标索引 支持&#xff1a;列表&#xff0c;元组&#xff0c;字符串 不支持&#xff1a;集合&#xff0c;字典 是否能放重复元素 是&#xff1a;列表&#xff0c;元组&#…

遥感分类产品精度验证之TIF验证TIF

KKB_2020.tif KKB_2020_JRC.tif kkb.geojson 所用到的包&#xff1a;&#xff08;我嫌geopandas安装太麻烦colab做的。。 import rasterio import geopandas as gpd import numpy as np import pandas as pd import matplotlib.pyplot as plt from sklearn.metrics import c…

【零基础】学JS之APIS(基于黑马)

喝下这碗鸡汤 披盔戴甲,一路勇往直前! 1. 什么是事件 事件是在编程时系统内发生的动作或者发生的事情 比如用户在网页上单击一个按钮 2. 什么是事件监听? 就是让程序检测是否有事件产生&#xff0c;一旦有事件触发&#xff0c;就立即调用一个函数做出响应&#xff0c;也称为 注…

如何用java语言开发一套数字化产科系统 数字化产科管理平台源码

如何用java语言开发一套数字化产科系统 数字化产科管理平台源码 要使用Java语言来开发一个数字化产科系统&#xff0c;你需要遵循一系列步骤&#xff0c;从环境搭建到系统设计与开发&#xff0c;再到测试与部署。 以下是一个大致的开发流程概览&#xff1a; 1. 环境搭建 Jav…

从Docker 网络看IaC

【引子】近来&#xff0c;老码农又一次有机会实施IaC 了&#xff0c; 但是环境有了新的变化&#xff0c;涵盖了云环境、虚拟机、K8S 以及Docker&#xff0c;而网络自动化则是IaC中的重要组成&#xff0c;温故知新&#xff0c;面向Docker 的网络是怎样的呢&#xff1f; Docker …

C++相关概念和易错语法(16)(list)

1.list易错点 &#xff08;1&#xff09;慎用list的sort&#xff0c;list的排序比vector慢得多&#xff0c;尽管两者时间复杂度一样&#xff0c;甚至不如先把list转为vector&#xff0c;用vector排完序后再转为list &#xff08;2&#xff09;splice是剪切链表&#xff0c;将…

指数增长远大于nlgn

在学习算法导论的时候&#xff0c;遇到了这么一行字把我难住了。我不理解为什么叶节点代价总和就为Ω(nlgn)了&#xff0c;后来经过学习之后了解了&#xff0c;因为n的指数严格大于1&#xff0c;只要指数函数的指数大于1就是指数增长&#xff0c;那么就远大于nlgn。

C++ | Leetcode C++题解之第22题完全二叉树的节点个数

题目&#xff1a; 题解&#xff1a; class Solution { public:int countNodes(TreeNode* root) {if (root nullptr) {return 0;}int level 0;TreeNode* node root;while (node->left ! nullptr) {level;node node->left;}int low 1 << level, high (1 <&…

【笔记】finalshell中使用nano编辑器GNU

ctrl O 保存 enter 确定 ctrl X 退出 nano编辑 能不用就不用吧 因为我真用不习惯 nano编辑的文件也可以用vim编辑的

Social to Sales全链路,数说故事专享会开启出海新视角

————瞎出海&#xff0c;必出局 TikTok&#xff0c;这个充满活力的短视频平台&#xff0c;已经成为全球范围内不可忽视的电商巨头。就在6月8日&#xff0c;TikTok美区带货直播诞生了首个“百万大场”。在此之前&#xff0c;百万GMV被视为一道难以逾越的高墙。以TikTok为首的…

CentOS 7遗忘了root密码怎么办?

正文共&#xff1a;666 字 12 图&#xff0c;预估阅读时间&#xff1a;1 分钟 说来也巧&#xff0c;突然发现使用KVM在部署CentOS时&#xff08;笔记本电脑安装CentOS系统&#xff09;&#xff0c;会有一个神奇的现象&#xff0c;还不是偶然出现的&#xff0c;在最近的三四次部…

4种叶轮平衡技巧 提高精度,降低故障率

在风机运作时&#xff0c;叶轮的动平衡是关键因素之一&#xff0c;不平衡的叶轮会产生振动和噪音&#xff0c;影响风机性能&#xff0c;甚至可能导致故障。 因此&#xff0c;掌握合适的平衡技术对提高设备稳定性和延长使用寿命至关重要。 本文将探讨几种有效的叶轮平衡方法及…

java中Request和Response的详细介绍

1.Request和Response的概述 # 重点 1. service方法的两个参数request和response是由tomcat创建的void service(ServletRequest var1, ServletResponse var2) 2. request 表示请求数据, tomcat将浏览器发送过来的请求数据解析并封装到request对象中servlet开发者可以通过reques…

基于AWS Billing Conductor自定义账单计算进行【linker账单】RI/SP还原以及账单菜单栏选择性精细化限制策略设置

文章目录 一、客户需求需求① 设置策略屏蔽billing菜单选项查看需求② 账单RI和SP还原及SP和RI的共享 二、AWS Billing Conductor介绍三、IAM 精细操作映射参考四、详细步骤操作演示4.1 AWS Organization策略设置4.2 账单和成本管理设置4.3 AWS Billing Conductor设置4.3.1 创建…

allWebPlugin中间件实现ActiveX插件在谷歌、火狐、Edge浏览器使用

下载并安装allWebPlugin中间件 1、请从下面地址下载allWebPlugin中间件产品&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1xUyQDzOabh7mU7J7TYhtig?pwdz3q0 提取码&#xff1a;z3q0 如下图所示&#xff0c;下载最新allWebPlugin_x86_v2.0.0.14_stable_20240707…

LiveNVR监控流媒体Onvif/RTSP用户手册-录像计划:批量配置、单个配置、录像保存(天)、配置时间段录像

TOC 1、录像计划 支持单个通道 或是 通道范围内配置支持快速滑选支持录像时间段配置 1.1、录像存储位置如何配置&#xff1f; 2、RTSP/HLS/FLV/RTMP拉流Onvif流媒体服务 支持 Windows Linux 及其它CPU架构&#xff08;国产、嵌入式…&#xff09;操作系统安装包下载 、 安装…

Hospital Management System v4.0 SQL 注入漏洞(CVE-2022-24263)

前言 CVE-2022-24263 是一个影响 Hospital Management System (HMS) v4.0 的 SQL 注入漏洞。这个漏洞允许攻击者通过注入恶意 SQL 代码来获取数据库的敏感信息&#xff0c;甚至可能控制整个数据库。以下是对这个漏洞的详细介绍&#xff1a; 漏洞描述 在 Hospital Management…

【MindSpore学习打卡】应用实践-自然语言处理-深入理解LSTM+CRF在序列标注中的应用

在自然语言处理(NLP)领域&#xff0c;序列标注是一项重要的任务。其目标是为给定的输入序列中的每个Token分配一个标签。序列标注的应用范围广泛&#xff0c;包括分词、词性标注、命名实体识别(NER)等。在本文中&#xff0c;我们将探讨如何利用LSTM和CRF模型进行序列标注&#…

无人机之穿越机知识篇

一、定义和类型 穿越机&#xff0c;即FPV Drone或Racing Drone&#xff0c;是一种主要通过第一人称视角&#xff08;FPV&#xff09;进行操作的无人机。这种无人机通常配备有四个电机和相应的飞控系统&#xff0c;使其具有极高的飞行自由度和速度。穿越机主要分为竞速型和花飞…

electron在VSCode和IDEA及webStrom等编辑器控制台打印日志乱码

window10环境下设置 1.打开Windows设置 2.打开时间和语言&#xff0c;选择语言菜单、如何点击管理语言设置 3.打开之后选择管理&#xff0c;选择更改系统区域设置&#xff0c;把Beta版&#xff1a;使用Unicode UTF-8提供全球语言支持 勾上&#xff0c;点击确定&#xff0c;…