MongoDB学习

发布于:2024-10-12 ⋅ 阅读:(234) ⋅ 点赞:(0)

系列文章目录

JavaSE
基础知识、数据类型学习 万年历项目 代码逻辑训练习题
代码逻辑训练习题 方法、数组学习 图书管理系统项目
面向对象编程:封装、继承、多态学习 封装继承多态习题 常用类、包装类、异常处理机制学习
集合学习 IO流、多线程学习 仓库管理系统JavaSE项目
员工管理系统、多表查询、反射实现DBHelper学习 DML、DDL、数据库对象学习
JavaWeb
网络编程、各种标签、CSS学习 ECMAScript、BOM学习 DOM、jQuery学习
Servlet、JSP、Cookie、Ajax学习 融资管理系统JavaWeb项目
框架
MyBatis框架学习 逆向工程、Spring框架IOC、AOP学习 SpringMVC框架学习
SpringBoot框架学习 招聘网站框架项目 Vue介绍、窗体内操作、窗体间操作学习
Vue路由配置、网络请求访问框架项目、element组件介绍学习 标准管理系统Vue项目
微服务
Linux安装、Nginx反向代理、负载均衡学习 Docker学习 Jenkins学习
Nexus学习 Spring Security学习 RabbitMQ学习
Redis学习 MongoDB学习 MongoDB学习
Nacos学习 Spring Session学习 Spring Gateway学习
JSR 303学习 OpenFeign学习 Hystrix学习


前言

本文我们要讲述:
MongoDB
在下攸攸太上,是银河系绝地武士赏金猎人。


一、MongoDB介绍

1. 非关系型数据库介绍

非关系型数据库(NoSQL)是指与传统的关系型数据库(如MySQL、Oracle等)不同的数据库系统,它们以非结构化或半结构化的数据存储方式来满足大规模数据存储和处理的需求。非关系型数据库通常以键值对、文档型、列存储和图形数据库等形式存储数据。

2. 非关系型数据库分类

键值存储数据库:数据存储为键值对的形式,如Redis、Memcached等。
文档型数据库:数据以文档的形式存储,通常使用JSON或BSON格式,如MongoDB、CouchDB等。
列存储数据库:数据以列族的形式存储,适合于数据仓库和分析场景,如HBase、Cassandra等。
图形数据库:用于存储图结构数据,适合于处理关系复杂的数据,如Neo4j、ArangoDB等。
MongoDB 是一种流行的文档型数据库,它使用JSON格式的文档来存储数据。

3. MongoDB介绍

MongoDB是一种开源的、面向文档的数据库管理系统(DBMS),采用文档型的存储方式。它以JSON格式的文档来存储数据,并使用灵活的数据模型来处理非结构化、半结构化和结构化数据。MongoDB由10gen公司(现在的MongoDB公司)在2009年推出,成为非关系型数据库领域的领先者之一。

4. MongoDB的优势

灵活的数据模型:MongoDB采用文档型存储方式,可以存储非结构化、半结构化和结构化数据,很适合于处理动态变化的数据模型。

横向扩展性:MongoDB支持分布式部署和自动分片,可以轻松地实现数据的横向扩展,承担大规模数据存储和处理的需求。

高性能:MongoDB采用内存映射文件的方式进行数据存储,可以提供快速的读写性能和高并发处理能力。

丰富的查询功能:MongoDB支持复杂的查询操作,包括范围查询、正则表达式查询、文本搜索等,提供了丰富的查询功能。

容易部署和管理:MongoDB提供了易于部署和管理的特性,可以快速搭建和维护数据库系统。

5. 常用名字对比

Mongo MySQL
数据库 database database
collection table
field column
document row
主键 primary key primary key
索引 index index
事务 multi-document transactions transactions

二、MongoDB安装

1. 拉取镜像

docker pull mongo:4.4.18

在这里插入图片描述

2. 创建数据挂载目录

创建/usr/local/docker/mongodb目录,分别执行如下命令

mkdir -p /usr/local/docker/mongodb/data
cd /usr/local/docker/mongodb
chmod 777 data

在这里插入图片描述

3. 启动容器

docker run -d \
  --name mongodb \
  --privileged \
  -p 27017:27017 \
  -v /usr/local/docker/mongodb/data:/data/db \
  -e MONGO_INITDB_ROOT_USERNAME=root \
  -e MONGO_INITDB_ROOT_PASSWORD=123456 \
  mongo:4.4.18 mongod --auth

在这里插入图片描述

4. 基本命令

# 1.进入容器
docker exec -it mongodb /bin/bash
# 2.查看版本
mongo --version
# 3.以root用户登录mongo,-p是密码,--port是端口号,--authenticationDatabase是验证权限的数据库
mongo --port 27017 -u "root" -p "123456" --authenticationDatabase "admin"  
# 4.展示所有的数据库
show dbs
# 5.切换到dz14b数据库
use dz14b
# 6.创建一个用户,用户名是user01,密码是123456,角色是读写角色,作用在dz14b数据库上
db.createUser({user:"user01", pwd:"123456",roles: [{role:"readWrite", db:"dz14b"}]})
# 7.查看所有的用户数据
show users
# 8.退出mongodb数据库
exit
# 9.退出mongodb容器
exit
# 10.再次进入容器,以mongo命令进入,进入到dz14b数据库中
docker exec -it mongodb mongo dz14b
# 11.查看当前在那个数据库
db
# 12.查看数据库,发现没有其他数据库,我们已经再dz14b了,所以查询不到其他数据库
show dbs
# 13.授权
db.auth("user01", "123456")
# 14.查看数据库,发现没有,授权影响不到用户的作用范围
show dbs
# 15.因为没有权限报错了
show users
# 16.向dz(dz自定义的名字)集合插入了一个文档,数据是inser方法的参数。对照sql理解:向dz表插入一条记录
db.dz.insert({name:"zhangsan"})
# 17.查询dz集合下所有的数据
db.dz.find()

第1-3步:
在这里插入图片描述
第4-7步:
在这里插入图片描述
第8-17步:
在这里插入图片描述

三、Navicat连接

1. 创建数据库连接

在这里插入图片描述

2. insert新建

db.dz.insert({name:"lisi", age:20});
db.dz.save({name:"wangwu", age:25});
db.dz.save({name:"zhangsan", age:25});
db.dz.insert({_id:ObjectId("63e4c8bdd20e7cc75a36a700"),name:"zhangsan1",age:20})
db.dz.save({_id:ObjectId("63e4c8bdd20e7cc75a36a700"),name:"zhangsan1",age:20})

insert只是新增,当_id重复时,会出错,save也是新增,当_id重复时,会做更改操作
在这里插入图片描述
在这里插入图片描述

3. find查询

db.dz.find({age : 25} )
db.dz.find({age : {$gt : 20}})
db.dz.find({age:{$gt:20},name:'zhangsan'})

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

4. delete删除

db.dz.deleteOne({age:20})
db.dz.deleteMany({age:20})

deleteOne:删除一项
deleteMany:删除所有符合项
在这里插入图片描述
在这里插入图片描述

5. update修改

db.dz.updateOne(
	{age:25},
	{$set:{age:20}}
)

db.dz.updateMany(
	{age:25},
	{$set:{age:20}}
)

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

6. 其他操作

# 查看所有数据库
show dbs
# 应用到指定数据库
use databasename
# 查看数据库下的集合
show collections
# 创建集合
db.createCollection("test_collection")
# 删除集合,test_collection是集合的名字
db.test_collection.drop()

四、MongoDB整合SpringBoot

目录结构:博主打错了,名字不要写Mango,写Mongo
在这里插入图片描述

1. 创建Maven项目

博主打错了,名字不要写Mango,写Mongo
在这里插入图片描述

2. 添加依赖

    <parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.6.13</version>
    </parent>

    <properties>
        <java.version>1.8</java.version>
        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
        <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
        <spring-boot.version>2.6.13</spring-boot.version>
        <jwt.version>0.7.0</jwt.version>
        <fastjson.version>1.2.60</fastjson.version>
    </properties>
    <dependencies>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-test</artifactId>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.projectlombok</groupId>
            <artifactId>lombok</artifactId>
        </dependency>
        <!--json-->
        <dependency>
            <groupId>com.alibaba</groupId>
            <artifactId>fastjson</artifactId>
            <version>${fastjson.version}</version>
            <scope>compile</scope>
        </dependency>
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-mongodb</artifactId>
        </dependency>
    </dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-maven-plugin</artifactId>
                <configuration>
                    <classifier>exec</classifier>
                </configuration>
            </plugin>
        </plugins>
    </build>

3. 添加配置

spring:
  data:
    mongodb:
      username: user01
      password: '123456'
      port: 27017
      host: 192.168.108.186
      database: dz14b

可以试试第二种配置方法

spring:
  data:
    mongodb:
      uri: mongodb://user01:123456@192.168.108.186:27017/dz12b

4. 编写User实体类

package com.jjy.entry;
import lombok.Data;
import org.springframework.data.annotation.Id;

@Data
public class User {

    @Id
    private String id;
    private String name;
    private String password;
}

5. 编写IUserDao文件

package com.jjy.dao;
import com.jjy.entry.User;

import java.util.List;

public interface IUserDao {

    /**
     * 新增
     *
     * @param user 目标对象
     */
    void insert(User user);

    /**
     * 删除
     *
     * @param id 对象主键
     */
    void delete(String id);

    /**
     * 修改
     *
     * @param user 目标对象
     */
    void update(User user);

    /**
     * 通过主键查询
     *
     * @param id 主键
     * @return user对象
     */
    User findById(String id);

    /**
     * 查询
     *
     * @param user 条件对象
     * @return user集合
     */
    List<User> query(User user);
}

6. 编写UserDaoImpl文件

package com.jjy.dao.impl;

import com.jjy.dao.IUserDao;
import com.jjy.entry.User;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.mongodb.core.MongoTemplate;
import org.springframework.data.mongodb.core.query.Criteria;
import org.springframework.data.mongodb.core.query.Query;
import org.springframework.data.mongodb.core.query.Update;
import org.springframework.stereotype.Repository;

import java.util.List;

@Repository
public class UserDaoImpl implements IUserDao {

    @Autowired
    private MongoTemplate mongoTemplate;

    @Override
    public void insert(User user) {
        mongoTemplate.insert(user);
    }

    @Override
    public User findById(String id) {
        return mongoTemplate.findById(id, User.class);
    }

    //    @Override
    public void delete1(String id) {
        User user = findById(id);
        if (user != null) {
            mongoTemplate.remove(user);
        } else {
            System.out.println("没有找到要删除的数据!");
        }
    }

    @Override
    public void delete(String id) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(id));
        mongoTemplate.remove(query, User.class);
    }

    @Override
    public void update(User user) {
        Query query = new Query();
        query.addCriteria(Criteria.where("_id").is(user.getId()));
        Update update = new Update();
        update.set("name", user.getName());
        update.set("password", user.getPassword());
        mongoTemplate.updateMulti(query, update, User.class);
    }

    @Override
    public List<User> query(User user) {
        Query query = new Query();
        if(user.getId() != null){
            query.addCriteria(Criteria.where("_id").is(user.getId()));
        }
        if(user.getName() != null){
            query.addCriteria(Criteria.where("name").is(user.getName()));
        }
        if(user.getPassword() != null){
            query.addCriteria(Criteria.where("password").is(user.getPassword()));
        }
        return mongoTemplate.find(query, User.class);
    }
}

7. 编写SpringBootMain启动类

package com.jjy;

import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;

@SpringBootApplication
public class SpringBootMain {

    public static void main(String[] args) {
        SpringApplication.run(SpringBootMain.class);
    }
}

8. 编写MongoDbTest测试类

package com.jjy.test;

import com.jjy.SpringBootMain;
import com.jjy.dao.IUserDao;
import com.jjy.entry.User;
import lombok.extern.slf4j.Slf4j;
import org.junit.jupiter.api.Test;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;


@Slf4j
@SpringBootTest(classes = SpringBootMain.class)
@SuppressWarnings("all")
public class MongoDbTest {

    @Autowired
    private IUserDao userDao;

    @Test
    public void testInsert() {
        User user = new User();
        user.setPassword("123");
        user.setName("zhangsan");
        userDao.insert(user);
    }

    @Test
    public void testFindById() {
        User byId = userDao.findById("661794efd775ee4bd7a6d069");
        System.out.println(byId);
    }

    @Test
    public void testDelete() {
        userDao.delete("6617970547fbc57ef66a962f");
    }

    @Test
    public void testUpdate() {
        User user = new User();
        user.setId("661797ee479a0c02f0dd9212");
        user.setPassword("123456");
        user.setName("lisi");
        userDao.update(user);
    }

    @Test
    public void testQuery() {
        User user = new User();
//        user.setId("661797ee479a0c02f0dd9212");
        user.setPassword("123");
//        user.setName("lisi");
        System.out.println(userDao.query(user));
    }

}

9. 运行测试类

在这里插入图片描述
数据库内User表(刷新出现):
在这里插入图片描述


总结

本文讲述了:
MongoDB:非关系型数据库
本人攸攸太上,我的左手寄宿着被戒指压制住的黑暗力量。
啊!我的右手好痛!!!
“吾乃漆黑之皇者,如今从这小子的右手中解放出来,哈哈哈哈哈哈哈哈哈哈!!!”


网站公告

今日签到

点亮在社区的每一天
去签到