数据库MongoDB

news2024/11/19 9:28:26

MongoDB记录是一个文档,由一个字段和值对组成的数据结构,文档类似于JSON对象。
一个文档认为就是一个对象,字段的数据类型是字符型,值除了使用基本类型外,还可以包括其他文档,普通数组和文档数组。
在这里插入图片描述
在这里插入图片描述

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

①、window安装
在这里插入图片描述
在这里插入图片描述

启动方式:

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

②、Linux中通过docker安装

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)

db.createCollection("collName")

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

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

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,或不写该字段

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

批量插入
如果某条数据插入失败,将会终止插入,但已经插入成功的数据不会回滚掉。
可以使用try{…}catch(e){print(e);}

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

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

db.comment.find(
	{userid:"1003"},
	{userid:1,nickname:1}
)

排序

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

文档更新

# 覆盖修改,修改_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)}})

分页查询

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) # 第三页

在这里插入图片描述

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

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

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

比较查询

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

包含查询

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

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

条件连接查询

# 查询评论集合中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}}]})

删除操作

db.User.remove(id) # 按照指定id移除

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

总结:
在这里插入图片描述

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

创建索引

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

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

移除索引

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

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

执行计划

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

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

MongoDB集群和安全

副本集的创建

一、创建主节点

二、创建副本节点

三、创建仲裁节点

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

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

六、添加副本节点

七、添加冲裁节点

八、数据的读写

故障测试

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

SpringBoot集成mongodb

spring-data-mongodb提供了两种方式访问mongodb
①、MongoTemplate
②、MongoRepository 不够灵活,所以MongoTemplate弥补了不足

一、添加依赖

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

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

spring.data.mongodb.uri=mongodb://47.93.118.241:27017/test

三、创建对应的实体类

@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

@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

public interface UserRepository extends MongoRepository<User,String>{

}

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

@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值");
}

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

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

相关文章

Python —— UI自动化之使用JavaScript进行元素点亮、修改、点击元素

1、JavaScript点亮元素 在控制台通过JavaScript语言中对元素点亮效果如下&#xff1a; 将这个语句和UI自动化结合&#xff0c;代码如下&#xff1a; locator (By.ID,"kw") # 是元组类型 web_element WebDriverWait(driver,5,0.5).until(EC.visibility_of_eleme…

Windows安装virtualenv虚拟环境

需要先安装好python环境 1 创建虚拟环境目录 还是在D:\Program\ 的文件夹新建 .env 目录&#xff08;你也可以不叫这个名字&#xff0c;一般命名为 .env 或者 .virtualenv &#xff0c;你也可以在其他目录中创建&#xff09; 2 配置虚拟环境目录的环境变量 3 安装虚拟环境 进…

网络原理之UDP协议

文章目录 前言应用层协议常见的几种数据格式1. xml2. JSON3. protobuffer 端口号传输层UDP 报文协议格式源端口号和目的端口号UDP 长度校验和 前言 前面我们学习了如何使用 UDP 数据报 和 TCP 流实现网络编程一个回显服务器&#xff0c;在知道了 UDP 和 TCP 协议的基本原理之后…

Arduino驱动BMA220三轴加速度传感器(惯性测量传感器篇)

目录 1、传感器特性 2、硬件原理图 3、驱动程序 BMA220的三轴加速度计是一款具有I2C接口的超小型三轴低g加速度传感器断路器,面向低功耗消费市场应用。它可以测量3个垂直轴的加速度,从而在手机、手持设备、计算机外围设备、人机界面、虚拟现实功能和游戏控制器中感知倾斜、…

MYSQL第五章节有关约束操作详解(附代码,例题详解)这一篇就够了

c知识点合集已经完成欢迎前往主页查看&#xff0c;点点赞点点关注不迷路哦 点我进入c第一章知识点合集 MYSQL第一章节DDL数据定义语言的操作----点我进入 MYSQL第二章节DDL-数据库操作语言 DQL-数据查询语言----点我进入 MYSQL第三章节DCL-管理用户&#xff0c;控制权限----点我…

【Lua语法】字符串

Lua语言中的字符串是不可变值。不能像在C语言中那样直接改变某个字符串中的某个字符&#xff0c;但是可以通过创建一个新字符串的方式来达到修改的目的 print(add2(1 , 2 ,15,3))a "no one"b string.gsub(a , "no" , "on1111")print(a) print…

英语——名言篇——成语

爱屋及乌 Love me, love my dog.百闻不如一见 (眼见为实 ) Seeing is believing.比上不足比下有余 worse off than some, better off than many; to fall short of the best, but be better than the worst.笨鸟先飞 A slow sparrow should make an early start.不眠之夜 white…

VSCode C/C++ 分目录+多文件编译配置2

前言&#xff1a;介绍 task.json 和 launch.json 文件 task.json 和 launch.json 是用于配置 VS Code 编辑器中的任务 和 调试功能的两个重要文件。 task.json 文件用于配置任务&#xff0c;它定义了执行特定操作的任务&#xff0c;并提供了相应的命令和参数。以下是 task.js…

BERT理解

参数计算&#xff08;沐神对于bert参数计算介绍&#xff09;

【趣味随笔】移动机器人基础(导航方式、自主导航、硬件系统结构分布)

&#x1f4e2;&#xff1a;如果你也对机器人、人工智能感兴趣&#xff0c;看来我们志同道合✨ &#x1f4e2;&#xff1a;不妨浏览一下我的博客主页【https://blog.csdn.net/weixin_51244852】 &#x1f4e2;&#xff1a;文章若有幸对你有帮助&#xff0c;可点赞 &#x1f44d;…

动画制作软件 Animate 2024 mac中文版介绍说明(an2024) v24.0

Animate 2024 mac是一款动画制作软件&#xff0c;它能帮助用户轻松制作出各种精美的动画作品。 Animate 2024拥有强大而直观的设计工作流程&#xff0c;能够让用户自由地构建动画场景、绘制精美的图形&#xff0c;并轻松添加动态效果。无论是传统手绘风格还是骨骼动画&#xff…

电路综合原理与实践---单双端口理想微带线(伪)手算S参数与时域波形

电路综合原理与实践—单双端口理想微带线&#xff08;伪&#xff09;手算S参数与时域波形与时域波形 1、单理想微带线&#xff08;UE&#xff09;的S参数理论推导 参考&#xff1a;Design of Ultra Wideband Power Transfer Networks的第四章&#xff0c;之后总结推导过程 2…

华为eNSP配置专题-RIP路由协议的配置

文章目录 华为eNSP配置专题-RIP路由协议的配置0、概要介绍1、前置环境1.1、宿主机1.2、eNSP模拟器 2、基本环境搭建2.1、终端构成和连接2.2、终端的基本配置 3、RIP路由的配置3.1、RIP路由的配置3.2、RIP路由的删除 华为eNSP配置专题-RIP路由协议的配置 0、概要介绍 路由信息…

2023年淘宝双十一预售红包入口介绍

2023年淘宝双十一预售红包入口介绍 近两年&#xff0c;淘宝双十一推出了预售玩法会场。在会场中&#xff0c;大家可以做预售任务&#xff0c;领取现金红包&#xff0c;让购物变得更省。那么&#xff0c;2023年淘宝双十一预售红包入口在哪里?下面小编就给大家介绍下&#xff0c…

SSM框架集成

文章目录 SSM1 介绍2 集成步骤目录结构配置 web.xml配置 jdbc.properties配置 SqlMapConfig.xml配置 applicationContext-dao.xml配置 applicationContext-service.xml配置 log4j.properties编写解决中文乱码的过滤器编写实体类编写 ItemsMapper 接口编写映射 ItemsMapper.xml编…

Power BI实现实时动态和用户输入的数据交互

背景&#xff1a;Power BI一般作为一个展示和分析数据的平台存在&#xff0c;即使是我们用Direct Query的mode也是受制于连接的数据库的表刷新&#xff0c;不能实现实时动态数据变化展示。 解决思路&#xff1a;当Power Apps里面输入了新的数据时&#xff0c;数据会写入到data…

[SWPUCTF 2023 秋季新生赛]——Web方向 详细Writeup

Web colorful_snake 来玩贪吃蛇~ F12查看源代码&#xff0c;可以看到this_is_real_flag函数&#xff0c;发现是unicode编码 利用网站转换得到flag 一键连接! 连连need <?php highlight_file(__FILE__); error_reporting(0); $md5_1 $_GET[md5_1]; $md5_2 $_GET[md5_2]; …

python实现客户成套订单配送策略混合遗传算法编码

以如下的论文文献为学习对象&#xff1a;2008年发表在《控制工程》的文献《客户成套订单配送策略混合遗传算法研究》 文献研究的学术意义 本文研究的目的是寻求在车队车辆数有限情况下 &#xff0c;如何合理安排每天的车辆 &#xff0c;使得总成本最小的方案。另外&#xff0…

Qt使用QListWidget实现自定义Item效果

Q&#xff1a;如何在Qt库的基础上&#xff0c;实现自定义控件呢&#xff1f; A&#xff1a;根据官方文档回答&#xff0c;就是继承需实现的控件&#xff0c;然后实现自定义功能。 以下是实现QListWidget控件的自定义item。 先看下最终效果是如何&#xff1a; listItem 主界面U…

sql高级教程-索引

文章目录 架构简介1.连接层2.服务层3.引擎层4.存储层 索引优化背景目的劣势分类基本语法索引结构和适用场景 性能分析MySq| Query Optimizerexplain 索引优化单表优化两表优化三表优化 索引失效原因 架构简介 1.连接层 最上层是一些客户端和连接服务&#xff0c;包含本地sock通…