数据库MongoDB

MongoDB记录是一个文档,由一个字段和值对组成的数据结构,文档类似于JSON对象。

一个文档认为就是一个对象,字段的数据类型是字符型,值除了使用基本类型外,还可以包括其他文档,普通数组和文档数组。

一、下载安装、解压、创建存放数据文件的目录data/db

①、window安装

启动方式:

  • 命令行参数方式启动,bin目录下打开命令提示符:mongod --dbpath=...\data\db 默认端口27017,可以通过--port来指定端口
  • 配置文件方式启动,在解压目录中创建config文件夹,该文件夹中新建配置文件mongod.conf

②、Linux中通过docker安装

bash 复制代码
docker pull mongo:latest

# 创建和启动容器
docker run -d --restart=always -p 27017:27017 --name mymongo -v /data/db:/data/db -d mongo

# 查看
docker ps

# 进入容器
docker exec -it mymongo /bin/bash

# 使用客户端进行操作
mongo

# 查询当前mogodb中有哪些数据库
show dbs

=========================================================================

命令行进行连接:

图形化界面进行连接:

Linux系统中进行安装、启动、连接








==============================================================

基本常用命令

创建一个集合(table)

bash 复制代码
db.createCollection("collName")

# 得到指定名称的集合
db.getCollection("user")

向comment集合中插入一条数据并查询

bash 复制代码
db.User.save({name:'jordan',age:23,sex:true})

db.User.find() #查询所有

db.User.find({name:"jordan"}) #查询指定名字的数据

db.User.find({age:23},{'name':1,'age':1}) #查询age=23的,只显示name/age字段

db.User.createIndex({"name":1}) # 添加索引

如果comment不存在,则会隐式创建

数字默认是double类型,如果存整型,需要函数NumberInt()

插入的数据没有指定_id,会自动生成主键值

如果某字段没有值,可以赋值为null,或不写该字段

yml 复制代码
db.comment.insert(
	{
		"articleid":"100000",
		"content":"今天天气好晴朗,处处好风光",
		"userid":"1001",
		"nickname":"Rose",
		"createdatetime":new Date(),
		"likenum":NumberInt(10),
		"state":null
	}
)

批量插入

如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。

可以使用try{...}catch(e){print(e);}

yml 复制代码
db.comment insertMany(
	[
		{"_id":"1","articleid":"100001","content":"天气晴朗","userid":"10002","nickname":"jordan","createdatetime":new Date("2008-08-01"),"likenum":NumberInt(1000),"state":"1"},
		{},
		{}
	]
)

投影查询(只查询部分字段)

yml 复制代码
db.comment.find(
	{userid:"1003"},
	{userid:1,nickname:1}
)

排序

bash 复制代码
#1为升序排列,-1为降序排列
db.User.find().sort({age:1}) 

文档更新

yml 复制代码
# 覆盖修改,修改_id为1,点赞量为1001
db.comment.update({_id:"1"},{likenum:NumberInt(1001)}) 

# 局部修改,修改_id为2,浏览量为889 
db.comment.update({_id:2},{$set:{likenum:NumberInt(889)}})

# 批量修改,更新所有用户为1003的用户的昵称
db.comment.update({userid:"1003"},{$set:{nickname:"jordan"}}) # 默认只修改一条数据
db.comment.update({userid:"1003"},{$set:{nickname:"jordan"}},{multi:true}) # 修改所有符合条件的数据

# 列值增长的修改,对原有值的基础上进行增加或减少,可以使用$inc运算符
# 对3号数据的点赞数,每次递增1
db.comment.update({_id:"3"},{$inc:{linknum:NumberInt(1)}})

分页查询

yml 复制代码
db.comment.find().limit(3) # 查询3条记录,默认值20
db.comment.find().skip(3) # 跳过3条记录,默认值0

# 每页2个
db.comment.find().skip(0).limit(2) # 第一页
db.comment.find().skip(2).limit(2) # 第二页
db.comment.find().skip(4).limit(2) # 第三页

正则表达式实现的模糊查询

yml 复制代码
# 内容评论包含开水打的所有文档
db.comment.find({content:/开水/})

# 以专家开头的评论内容
db.comment.find({content:/^专家/})

比较查询

yml 复制代码
# 评论点赞数大于700
db.comment.find({linenum:{$gt:NumberInt(700)}})

包含查询

yml 复制代码
# 查询评论集合中userid字段包含1003或1004的文档
db.comment.find({userid:{$in:["1003","1004"]}})

# 不好含使用$nin操作符 查询集合中suerid字段不包含1003和1004的文档
db.comment.find({userid:{$nin:["1003","1004"]}})

条件连接查询

yml 复制代码
# 查询评论集合中likenum大于等于700并且小于2000的文档 $and:[{},{}]
db.comment.find({$and:[{likenum:{$gte:NumberInt(700)}},{likenum:{$lt:NumberInt(2000)}}]})

# 或  $or:[{},{}]  查询评论集合中userid为1003,或者点赞数小于1000的文档记录
db.comment.find({$or:[{userid:"1003"},{likenum:{$lt:1000}}]})

删除操作

bash 复制代码
db.User.remove(id) # 按照指定id移除

db.User.remove() #移除所有

总结:

====================================================================

创建索引

yml 复制代码
# 单字段索引,对userid字段建立索引
db.comment.createIndex({userid:1})

# 复合字段索引,对userid和nickname同时建立复合索引
db.comment.createIndex({userid:1,nickname:-1})

移除索引

yml 复制代码
# 删除userid字段上的升序索引
db.comment.dropIndex({userid:1})

# 删除所有索引(_id的字段是无法删除的,只能删除非_id字段的索引)
db.comment.dropIndexes()

执行计划

yml 复制代码
# 根据userid查询数据的情况,建立的索引是否有效,效果如何
db.comment.find({userid:"1003"}).explain()

=================================================

MongoDB集群和安全

副本集的创建

一、创建主节点

二、创建副本节点

三、创建仲裁节点

四、初始化配置副本集和主节点

五、查看副本集的配置内容和副本集的状态

六、添加副本节点

七、添加冲裁节点

八、数据的读写

故障测试

=========================================================

SpringBoot集成mongodb

spring-data-mongodb提供了两种方式访问mongodb

①、MongoTemplate

②、MongoRepository 不够灵活,所以MongoTemplate弥补了不足

一、添加依赖

xml 复制代码
<dependency>
	<groupId>org.springframework.boot</groupId>
	<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>

二、application.properties配置文件添加连接信息

bash 复制代码
spring.data.mongodb.uri=mongodb://47.93.118.241:27017/test

三、创建对应的实体类

java 复制代码
@Data
@Document("User") //指定对应的mongodb对应的
public class User{
	@Id
	private String id;
	private String name;
	private Integer age;
	private String email;
	private String createData;
}

四、测试

通过MongoTemplate实现对MongoDB的CRUD

java 复制代码
@SpringBootTest
public class DemomogoApplicationTests{
	
	@Autowired
	private MongoTemplate mongoTemplate;

	//添加操作
	@Test
	public void create(){
		User user = new User();
		user.setAge(20);
		user.setName("jordan");
		user.setEmail("jordan@qq.com");

		User user = mongoTemplate.insert(user);//返回添加后的数据
		
	}

	//查询所有记录
	@Test
	public void findAll(){
		List<User> all = mongoTemplate.findAll(User.class);
		System.out.println(all);
	}

	//根据id查询
	@Test
	public void findById(){
		User user = mongoTemplate.findById("id",User.class);
	}
	
	//条件查询
	@Test
	public void findUserList(){
		Query query = new Query(Criteria.where("name").is("jordan").and("age").is(23));
		mongoTemplate.find(query,User.class);
	}

	//模糊查询
	@Test
	public void findLikeUserList(){
		
		String name = "jor";
		String regex = String.format("%s%s%s","^.*",name,".*$");
		Pattern pattern = Pattern.compile(regex.Pattern.CASE_INSENSTIVE);
		
		Query query = new Query(Criteria.where("name").regex(pattern));
		mongoTemplate.find(query,User.class);
	}

	//分页查询
	@Test
	public void findPageUserList(){
		int pageNo = 1; //当前页
		int pageSize = 3; //每页显示数

		String name = "jor";
		String regex = String.format("%s%s%s","^.*",name,".*$");
		Pattern pattern = Pattern.compile(regex.Pattern.CASE_INSENSTIVE);
		
		Query query = new Query(Criteria.where("name").regex(pattern));

		//分页构建
		//查询记录数(当前页=(pageNo - 1)*pageSize)
		long count = mongoTemplate.count(query,User.class);
		List<User> users = mongoTemplate.find(query,skip((pageNo - 1)*pageSize).limit(pageSize),User.class);
	}

	//修改操作
	@Test
	public void updateUser(){
		//1.根据id查询
		User user = mongoTemplate.findById("id",User.class);
		//2.设置修改值
		user.setName("kobe");
		user.setAge(24);
		user.setEmail("kobe@qq.com");
		//3.调用方式实现修改
		Query query = new Query(Criteria.where("_id").is(user.getId()));
		Update update = new Update();
		update.set("name",user.getName());
		update.set("age",user.getAge());
		update.set("email",user.getEmail());
		UpdateResult upsert = mongoTemplate.upsert(query,update,User.class);
		long modifiedCount = upsert.getModifiedCount();//影响的行数
	}

	//删除操作
	@Test
	public void deleteUser(){
		Query query = new Query(Criteria.where("_id").is("id获取"));
		DeleteResult remove = mongoTemplate.remove(query,User.class);
		long deletedCount = remove.getDeleteCount();
		System.out.println(deletedCount);
	}
}

通过MongoRepository实现对MongoDB的CRUD

SpringData提供了对mongodb的数据访问支持,只需要继承MongoRepository

①、创建一个接口继承MongoRepository

java 复制代码
public interface UserRepository extends MongoRepository<User,String>{

}

②、将上面的接口注入到业务类中

java 复制代码
@Autowired
private UserRepository userRepository;

//添加操作
@Test
public void create(){
	User user = new User();
	user.setAge(16);
	user.setName("james");
	user.setEmail("james.qq.com");

	User u = userRepository.save(user);
}

//查询所有
@Test
public void findId(){
	List<Uer> all = userRepository.findAll();
}

//根据id查询
@Test
public void findId(){
	User user = userRepository.findById("id值").get();
}

//条件查询
@Test
public void findUserList(){
	User user = new User();
	user.setAge(23);
	user.setName("jordan");
	Example<User> userExample = Example.of(user);
	List<User> all = userRepository.findAll(userExample);
}

//模糊查询
@Test
public void findLikeUserList(){

	//设置模糊查询的匹配规则(设置模糊查询,忽略大小写)
	ExampleMatcher matcher = ExampleMatcher.matching()
		.withStringMatcher(ExampleMather.StringMatcher.CONTAINING)
		.withIgnoreCase(true);
	
	User user = new User();
	user.setAge(23);
	user.setName("jor");
	Example<User> userExample = Example.of(user,matcher);
	List<User> all = userRepository.findAll(userExample);
}

//分页查询
@Test
public void findPageUserList(){
	//设置分页参数
	//0代表第一页
	Pageable pageable = PageRequest.of(0,3);
	
	User user = new User();
	user.setName("jordan");
	Example<User> userExample = Example.of(user);
	Page<User> page = userRepository.findAll(userExample,pageable);  
	page.getTotalPages();//总页数
}

//修改
@Test
public void updateUser(){
	User user = userRepository.findById("id值").get();
	user.setAge(100);
	user.setName("jordan");
	user.setEmail("jordan@qq.com");
	User save = userRepository.save();//如果有id表示修改,没有id表示保存
}

//删除
@Test
public void deleteUser(){
	userRepository.deleteById("id值");
}
相关推荐
延凡科技5 小时前
延凡科技综合监控预警处置平台—— 一体化视频AI安防闭环系统设计与功能实现[特殊字符]️
数据库·人工智能·科技·安全·能源
老马聊技术5 小时前
Rocky Linux 9.0 安装 MySQL8.x详细教程
linux·数据库
醇氧5 小时前
主流 Agent 开发框架全解析(2026 最新)
大数据·数据库·人工智能·开源
吴声子夜歌5 小时前
Redis 6.x——整合SpringBoot
数据库·spring boot·redis
ATA88885 小时前
AI辅助生成SQL实战从连接配置到执行计划优化的完整技术流程
数据库·人工智能·智能问数
咏方舟【长江支流】5 小时前
【开源】跨语言·跨平台·跨数据库(4) ——用宝框架 ORM 数据源适配器
数据库·开源·ai编程·orm·咏方舟-长江支流·用宝框架·用宝框架orm
JZC_xiaozhong5 小时前
OA调价审批后,采购调价单如何自动同步到ERP?解决漏录错价难题
大数据·linux·服务器·前端·数据库·数据孤岛解决方案·数据集成与应用集成
渣渣灰飞5 小时前
MySQL 系统学习 第五阶段:企业级 MySQL 实战开发 第一章:企业数据库设计规范
数据库·学习·mysql
IvorySQL6 小时前
PG 日报|新增 VFD 缓存监控视图,精细化数据库调优
大数据·数据库·人工智能·缓存·postgresql·区块链
咏方舟【长江支流】6 小时前
【开源】跨语言·跨平台·跨数据库(3) —— 为用宝框架增加ORM,让AI执行
数据库·人工智能·开源·ai编程·orm·咏方舟-长江支流·用宝框架