【MongoDB详细步骤】(内附源码)
第01章-MongoDB
1、安装和启动(docker方式)
1.1、拉取镜像
docker pull mongo:4.4.8
1.2、创建和启动容器
docker run -d --restart=always -p 27017:27017 --name atguigu_syt_mongo -v /atguigu/syt/mongo/data/db:/data/db mongo:4.4.8 --auth
常见问题:以下IPv4问题会导致无法远程链接redis服务
解决方案:
#修改配置文件:
vim /usr/lib/sysctl.d/00-system.conf
#追加
net.ipv4.ip_forward=1
#接着重启网络
systemctl restart network
1.3、进入容器
docker exec -it atguigu_syt_mongo /bin/bash
1.4、进入MongoDB客户端
mongo
1.5、创建超级用户
show dbs
use admin
db.createUser({ user: "root" , pwd: "123456", roles: ["root"]})
1.6、登录超级用户
db.auth("root","123456")
1.7、基本命令
db.version() #当前db版本
db.getMongo() #查看当前db的链接机器地址
db.help() #帮助
quit() #退出命令行
常见问题
mongodb一直重启问题
mongo 容器 Restarting (62) 2 seconds ago
主要原因:新版本4.4的MongoDB 和之前安装的MongoDB (最新版)的数据存在冲突。
解决方案:因此删除之前MongoDB 的数据目录即可。
例如数据路径是: /atguigu/syt/mongo/data/db
,直接rm -r /atguigu/syt/mongo/data/db/*
。
2、客户端远程远程连接
资料:资料>mongodb客户端>mongodb-compass-1.35.0-win32-x64.zip
解压并启动 mongodb-compass-1.35.0-win32-x64.zip
客户端连接:
3、MongoDB 概念
3.1、什么是MongoDB
MongoDB 是在2007年由DoubleClick公司的几位核心成员开发出的一款分布式文档数据库,由C++语言编写。
目的是为了解决数据大量增长的时候系统的可扩展性和敏捷性。MongoDB要比传统的关系型数据库简单很多。
在MongoDB中数据主要的组织结构就是数据库、集合和文档
,文档存储在集合当中,集合存储在数据库中。
MongoDB中每一条数据记录就是一个文档,数据结构由键值(key=>value)对组成
。
文档类似于 JSON 对象,它的数据结构被叫做BSON
(Binary JSON)。
下表将帮助您更容易理解MongoDB中的一些概念:
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表格 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | _id |
3.2、MongoDB适用场景
MongoDB不需要去明确指定一张表的具体结构,对字段的管理非常灵活,有很强的可扩展性。
支持高并发、高可用、高可扩展性,自带数据压缩功能,支持海量数据的高效存储和访问。
支持基本的CRUD、数据聚合、文本搜索和地理空间查询功能。
适用场景:
- 网站数据:Mongo非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的复制及高度伸缩性。
- 高伸缩性的场景:Mongo非常适合由数十或数百台服务器组成的数据库。
- 大尺寸,低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
- 缓存:由于性能很高,Mongo也适合作为信息基础设施的缓存层。在系统重启之后,由Mongo搭建的持久化缓存层可以避免下层的数据源过载。
例如:
弹幕、直播间互动信息、朋友圈信息、物流场景等
不适用场合:
- 高度事务性系统:例如银行系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
- 传统的商业智能应用:针对特定问题的BI数据库会对产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
4、数据库操作
4.1、创建数据库
如果数据库不存在,则创建数据库,否则切换到指定数据库。
use test
4.2、查看当前数据库
db.getName()
4.3、显示当前数据库状态
db.stats()
4.4、删除当前数据库
db.dropDatabase()
5、集合操作
5.1、创建集合
db.createCollection("User")
5.2、删除集合
db.User.drop()
6、文档操作
文档是一组键值(key-value)对。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是 MongoDB 非常突出的特点。
需要注意的是:
1、MongoDB区分类型和大小写。
2、MongoDB的文档不能有重复的键。
6.1、insert
向User集合插入一条记录。可以预先使用createCollection方法创建集合,也可以不创建集合,直接插入数据,那么集合会被自动创建
db.User.insert({name:'zhangsan',age:21,sex:true})
6.2、query
查询当前User集合中所有的记录
db.User.find()
查询当前User集合中name是zhangsan的记录
db.User.find({name:"zhangsan"})
6.3、update
只更新匹配到的第一条记录
db.User.update({age:21}, {$set:{name:100}})
更新匹配到的所有记录
db.User.update({age:21}, {$set:{age:99}}, {multi: true})
6.4、remove
移除一个文档
db.User.remove(id)
移除所有文档
db.User.remove({})
更多命令参考:https://www.runoob.com/mongodb/mongodb-tutorial.html
第02章-SpringBoot集成MongoDB
spring-data-mongodb提供了MongoTemplate
与MongoRepository
两种方式访问mongodb,MongoRepository操作简单,MongoTemplate操作灵活,我们在项目中可以灵活使用这两种方式操作mongodb。
1、集成spring-data-mongodb
1.1、添加用户
如果想在springboot中访问MongoDB,需要再创建一个非root用户。首先使用超级用户账号登录,然后创建数据库yygh,在yygh下创建一个用户:
use syt
db.createUser({user: "atguigu",pwd: "123456",roles: ["readWrite"]})
客户端连接:
1.2、引入依赖
在service-hosp中引入依赖
<!--mongodb-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
1.3、添加MongoDB配置
在service-hosp中的application-dev.yml文件中添加配置
spring:
data:
mongodb:
database: syt
host: 192.168.100.101
password: '123456'
port: 27017
username: atguigu
打印mongodb命令的日志
logging:
level:
root: info
org:
mongodb:
driver:
protocol:
command: debug
file:
path: hosp
1.4、添加实体
test目录添加com.atguigu.syt.hosp.mongo包,添加User类
package com.atguigu.syt.hosp.mongo;
import lombok.Data;
import org.bson.types.ObjectId;
import org.springframework.data.annotation.Id;
import org.springframework.data.mongodb.core.mapping.Document;
import java.util.Date;
@Data
@Document("user") //指定mongodb中的集合名字
public class User {
@Id
private ObjectId id;
private String name;
private Integer age;
private String email;
private Date createDate;
}
2、MongoRepository
2.1、添加Repository类
test目录添加UserRepository
package com.atguigu.syt.hosp.mongo;
public interface UserRepository extends MongoRepository<User, ObjectId> {
}
2.2、创建测试类
test目录创建测试类:MongoRepositoryTest
package com.atguigu.syt.hosp.mongo;
@SpringBootTest
public class MongoRepositoryTest {
@Resource
private UserRepository userRepository;
//插入
@Test
public void testCreateUser(){
User user = new User();
user.setName("小谷");
user.setAge(19);
user.setCreateDate(new Date());
userRepository.save(user);
}
//查询所有
@Test
public void testFindAll(){
List<User> userList = userRepository.findAll();
System.out.println(userList);
}
//根据id查询
@Test
public void testFindById(){
Optional<User> optional = userRepository.findById(
new ObjectId("6412fa11fa5cdd0300a2d4e4")
);
boolean present = optional.isPresent();
if(present){
User user = optional.get();
System.out.println(user);
}
}
//条件查询
@Test
public void testFindAllExample(){
User user = new User();
user.setAge(19);
Example<User> example = Example.of(user);
List<User> userList = userRepository.findAll(example);
System.out.println(userList);
}
//排序查询
@Test
public void testFindAllSort(){
Sort sort = Sort.by(Sort.Direction.DESC, "age");
List<User> userList = userRepository.findAll(sort);
System.out.println(userList);
}
//分页查询
@Test
public void testFindAllPage(){
PageRequest pageRequest = PageRequest.of(0, 10);
Page<User> page = userRepository.findAll(pageRequest);
int totalPages = page.getTotalPages();
List<User> userList = page.getContent();
System.out.println(userList);
System.out.println(totalPages);
}
//更新
@Test
public void testUpdateUser(){
//注意:先查询,再更新
Optional<User> optional = userRepository.findById(
new ObjectId("6412fa11fa5cdd0300a2d4e4")
);
if(optional.isPresent()){
User user = optional.get();
user.setAge(100);
//user中包含id,就会执行更新
userRepository.save(user);
System.out.println(user);
}
}
//删除
@Test
public void testDeleteUser(){
userRepository.deleteById(
new ObjectId("6412fa11fa5cdd0300a2d4e4")
);
}
}
3、SpringData方法规范
3.1、方法规范说明
我们只需要继承MongoRepository类,按照Spring Data规范定义接口方法就可以。
1、 查询方法以find | read | get开头
2、 涉及条件查询时,条件的属性用条件关键字连接
3、条件属性首字母需要大写
3.2、定义接口方法
package com.atguigu.syt.hosp.mongo;
public interface UserRepository extends MongoRepository<User, ObjectId> {
List<User> findByName(String name);
List<User> findByNameLike(String name);
List<User> findByNameAndAge(String name, Integer age);
}
3.3、测试
@Test
public void testFindByName() {
List<User> users = userRepository.findByName("test");
System.out.println(users);
}
@Test
public void testFindByNameLike() {
List<User> users = userRepository.findByNameLike("e");
System.out.println(users);
}
@Test
public void testFindByNameAndAge() {
List<User> users = userRepository.findByNameAndAge("test", 20);
System.out.println(users);
}
4、MongoTemplate
test目录创建测试类:MongoTemplateTest
package com.atguigu.syt.hosp.mongo;
@SpringBootTest
public class MongoTemplateTest {
@Resource
private MongoTemplate mongoTemplate;
//添加
@Test
public void testCreateUser(){
User user = new User();
user.setAge(20);
user.setName("test");
user.setEmail("test@qq.com");
mongoTemplate.insert(user);
System.out.println(user);
}
//查询所有
@Test
public void testFindUser() {
List<User> userList = mongoTemplate.findAll(User.class);
System.out.println(userList);
}
//根据id查询
@Test
public void testFindUserById(){
User user = mongoTemplate.findById("6412f9b27f3f675ef4c5ebb6", User.class);
System.out.println(user);
}
//修改
@Test
public void testUpdateUser() {
Criteria criteria = Criteria.where("_id").is("6412f9b27f3f675ef4c5ebb6");
Query query = new Query(criteria);
Update update = new Update();
update.set("name", "zhangsan");
update.set("age", 99);
UpdateResult result = mongoTemplate.upsert(query, update, User.class);//改一条
//UpdateResult result = mongoTemplate.updateMulti(query, update, User.class);//改多条
long count = result.getModifiedCount();
System.out.println(count);
}
//删除
@Test
public void testRemove() {
Criteria criteria = Criteria.where("_id").is("6412f9b27f3f675ef4c5ebb6");
Query query = new Query(criteria);
DeleteResult result = mongoTemplate.remove(query, User.class);
long count = result.getDeletedCount();
System.out.println(count);
}
//条件查询 and
@Test
public void findUserList() {
Criteria criteria = Criteria.where("name").is("test").and("age").is(20);
Query query = new Query(criteria);
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
//模糊查询
@Test
public void findUsersLikeName() {
Pattern pattern = Pattern.compile("^zhang", Pattern.CASE_INSENSITIVE);
Criteria criteria = Criteria.where("name").regex(pattern);
Query query = new Query(criteria);
List<User> userList = mongoTemplate.find(query, User.class);
System.out.println(userList);
}
//分页查询
@Test
public void findUsersPage() {
Query query = new Query();
//先查询总记录数
long count = mongoTemplate.count(query, User.class);
System.out.println(count);
//后查询分页列表
List<User> userList = mongoTemplate.find(query.skip(0).limit(2), User.class);
System.out.println(userList);
}
}
源码:https://gitee.com/dengyaojava/guigu-syt-parent
【MongoDB详细步骤】(内附源码)的更多相关文章
- SSM框架整合 详细步骤(备注) 附源码
整合思路 将工程的三层结构中的JavaBean分别使用Spring容器(通过XML方式)进行管理. 整合持久层mapper,包括数据源.会话工程及mapper代理对象的整合: 整合业务层Service ...
- 从零实现在线云相亲APP|程序员脱单神器(内附源码Demo)
实时音视频通话涉及到的技术栈.人力成本.硬件成本非常大,一般个人开发者基本无法独立完成一个功能健全并且稳定的实时音视频应用.本文介绍一天之内,无任何实时音视频低层技术的android开发者完成实时相亲 ...
- Spring中@Transactional事务回滚(含实例详细讲解,附源码)
一.使用场景举例 在了解@Transactional怎么用之前我们必须要先知道@Transactional有什么用.下面举个栗子:比如一个部门里面有很多成员,这两者分别保存在部门表和成员表里面,在删除 ...
- Duboo整合SpringBoot超级详细例子(附源码)
dubbo3.0整合SpringBoot例子 dubbo新版本(3.0以上)在相对于 dubbo 旧版本(2.5.2.6.2.7),有很多的不相同的地方. 官方文档也说了新版本的特性: https:/ ...
- python爬虫爬取网易云音乐(超详细教程,附源码)
一. 前言 先说结论,目前无法下载无损音乐,也无法下载vip音乐. 此代码模拟web网页js加密的过程,向api接口发送参数并获取数据,仅供参考学习,如果需要下载网易云音乐,不如直接在客户端下载,客户 ...
- 基于电商直播SDK快速实现一个淘宝直播APP【内附源码】
现在各大互联网APP都标配电商直播带货了,没有直播带货开发经验都感觉自己跟不上技术的进步.今天快速基于Java实现一个安卓端电商直播APP,深入理解整个电商直播开发流程.我们最终实现效果如下: 按照惯 ...
- 干货:Java多线程详解(内附源码)
线程是程序执行的最小单元,多线程是指程序同一时间可以有多个执行单元运行(这个与你的CPU核心有关). 在java中开启一个新线程非常简单,创建一个Thread对象,然后调用它的start方法,一个 ...
- jquery省市区三级联动(数据来源国家统计局官网)内附源码下载
很久很久没有写博了. 今天更新了项目的省市区三级联动数据,更新后最新的海南三沙都有,分享给所有需要的小伙伴们... JQUERY + JSON,无数据库,纯JS代码,无加密,无压缩,可直接使用在任何项 ...
- java小项目之:抽奖系统!java初学者必备(内附源码)
[Java]Java摇奖源码,Java抽奖源码,Java随机抽奖源码 任务描述 本次任务要求为某商场开发一套幸运抽奖系统,客户必须首先注册成为该商场会员,会员登录成功后,就可以参加抽奖活动了.注册 用 ...
- MongoDB数据访问[C#]附源码下载(查询增删改) 转载
安装完MongoDBhttp://localhost:28017/监测是否成功! vs 2008 C# MongoDB 源代码下载地址:http://download.csdn.net/source/ ...
随机推荐
- 驱动开发:如何枚举所有SSDT表地址
在前面的博文<驱动开发:Win10内核枚举SSDT表基址>中已经教大家如何寻找SSDT表基地址了,找到后我们可根据序号获取到指定SSDT函数的原始地址,而如果需要输出所有SSDT表信息,则 ...
- LeetCode刷题日记 2020/8/28
题目描述: 最长有效括号 给定一个只包含 '(' 和 ')' 的字符串,找出最长的包含有效括号的子串的长度. 示例 1: 输入: "(()" 输出: 2 解释: 最长有效括号子串为 ...
- Properties集合的使用
Properties集合是唯一一个可以和IO流相结合的集合 可以将集合中的数据持久化存储,也可以将硬盘上的数据加载到该集合中. 1 Properties集合添加.遍历 1 private static ...
- 基于AvaloniaUI开发跨平台.NET三维应用:环境搭建
本文介绍在Vistual Studio 2022中使用Avalonia和集成AnyCAD AvaloniaUI三维控件的的过程. 目录 0 初始化环境 1 创建项目 2 集成AnyCAD Avalon ...
- 5个前端开源项目带你在Web上体验Windows
本文来分享五个 yyds 的开源项目,这些项目把 Windows 带到了 Web 平台上.让我们一起感受这些项目带来的回忆和创新,重温 Windows 93.98.XP 和 7 的经典界面,甚至探索现 ...
- CF1916E Happy Life in University 题解
题目: CF1916E Happy Life in University 链接: 洛谷 或者 CF 前置知识点: 线段树与HH的项链 先简单回顾下HH的项链这题怎么做的吧.先去掉莫队算法,因为这个不是 ...
- require 与 import
common.js 模块化规范 app.js 文件: // require 在代码执行阶段才会调用引入文件,编译(预解析)时不会执行,所以下面会报错 // console.log(dep); Re ...
- delphi中 注意一点,record 类型 参数默认是 值拷贝,class 参数 默认是传地址;值传递,指针传递、引用传递
作为函数的入参,若是record类型,默认是值拷贝,效率低,若要传指针,需要加 var ; 作为函数的入参,若是 class类型,默认是传地址,不需要加var unit Unit1; interfac ...
- CentOS 安装字体
问题来源,今天服务端生成中文图片验证码的Base64字符串,结果返回到客户端后,解码Base64发现是乱码,怀疑是Centos 系统不包含中文字体的问题, 安装字体后,果然问题解决了,以后做系统镜像的 ...
- Oracle-ORA-12505, TNS:listener does not currently know of SID given in connect descriptor
问题描述 ORA-12505, TNS:listener does not currently know of SID given in connect descriptorORA-12505: TN ...