【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/ ...
随机推荐
- Dubbo3应用开发—Dubbo注册中心引言
Dubbo注册中心引言 什么是Dubbo注册中心 Dubbo的注册中心,是Dubbo服务治理的⼀个重要的概念,他主要用于 RPC服务集群实例的管理. 注册中心的运行流程 使用注册中心的好处 可以有效的 ...
- 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取)、文本分类等
文本抽取任务Label Studio使用指南 1.基于Label studio的训练数据标注指南:信息抽取(实体关系抽取).文本分类等 2.基于Label studio的训练数据标注指南:(智能文档) ...
- 3.2 IDAPro脚本IDC常用函数
IDA Pro内置的IDC脚本语言是一种灵活的.C语言风格的脚本语言,旨在帮助逆向工程师更轻松地进行反汇编和静态分析.IDC脚本语言支持变量.表达式.循环.分支.函数等C语言中的常见语法结构,并且还提 ...
- 创建framework静态库和.a静态库
在APP项目中使用的静态库有两种,一是.a静态库,另一种是framework静态库.下面分布介绍这2中静态库的创建过程,以及通过脚本工具做自动化打包的2种方式. Framework静态库生成 如果 ...
- STM32CubeMX教程31 USB_DEVICE - HID外设_模拟键盘或鼠标
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) keil µVision5 IDE(MDK-Arm) ST-LINK/V2驱动 ...
- ABC311_g One More Grid Task 题解
题目链接:Atcoder 或者 洛谷 对于解决二维区间内的最值类型问题,我们常常有一类特别好用的方法,就是悬线法,它可以看做是单调栈的子集,但更加好理解和书写. 对于悬线法,我们有一个常见的模型,找出 ...
- Java - CodeForces - 266A
题目: 桌子上有n块石头排成一行,每一块都可以是红色.绿色或蓝色.计算从表中取出的石头的最小数量,以便相邻的任何两块石头具有不同的颜色.如果一排石头之间没有其他石头,则认为它们相邻. 输入: 第一行包 ...
- delphi 下获取一个字符的 Unicode 编码
用 Ord('万') 可以得到 "万" 字的 UniCode 的编码.
- 吉特日化MES & 日化制药工厂信息化系统架构图
作者:情缘 出处:http://www.cnblogs.com/qingyuan/ 关于作者:从事仓库,生产软件方面的开发,在项目管理以及企业经营方面寻求发展之路 版权声明:本文版权归作者和博客园 ...
- NC224933 漂亮数
题目链接 题目 题目描述 小红定义一个数满足以下条件为"漂亮数": 该数不是素数. 该数可以分解为2个素数的乘积. 4 是漂亮数,因为 4=2*2 21 是漂亮数,因为 21=3* ...