微服务MongoDB解析部署使用全流程

news2024/11/16 2:40:42

1、什么是MongoDB

1、非关系型数据库

NoSQL,泛指非关系型的数据库。随着互联网web2.0网站的兴起,传统的关系数据库在处理web2.0网站,特别是超大规模和高并发的SNS类型的web2.0纯动态网站已经显得力不从心,出现了很多难以克服的问题,而非关系型的数据库则由于其本身的特点得到了非常迅速的发展。NoSQL数据库的产生就是为了解决大规模数据集合多重数据种类带来的挑战,特别是大数据应用难题。

2、非关系型数据库分类

键值(Key-Value)存储数据库

类似于HashMap的方式,例如redis

列存储数据库

以列为概念的,用于处理大数据量的数据,例如HBase

文档型数据库

是应用比较广泛的,以文档形式处理数据的,文档不是硬盘上直接对应的文件,是个概念,例如MongoDB

图形(Graph)数据库

Neo4j是一个高性能的,NOSQL图形数据库,它将结构化数据存储在网络上而不是表中。它是一个嵌入式的、基于磁盘的、具备完全的事务特性的Java持久化引擎,但是它将结构化数据存储在网络(从数学角度叫做图)上而不是表中。Neo4j也可以被看作是一个高性能的图引擎,该引擎具有成熟数据库的所有特性。程序员工作在一个面向对象的、灵活的网络结构下而不是严格、静态的表中——但是他们可以享受到具备完全的事务特性、企业级的数据库的所有好处。

3、MongoDB?bson格式什么样?

MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。 MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。

JSON的BSON格式‌是一种二进制表示的数据交换格式,它是“Binary JSON”的缩写。

2、MongoDB的优势

  • 简单性,应用起来比较容易,易上手

  • 扩展性,指的是mango本身的拓展,比如说可以做分片模式集群等等

  • 高性能,在Wiretiger存储引擎的加持下,数据的读写可以做到更大的吞吐量

  • 高可用,自身出现故障的情况很少,也可以通过集群的方式再提供高可用性,还支持故障转移

  • 存文件,mongo天然支持文件存储,以桶的形式,用的对象是GridFS,文件会被切割成多个16M大小存储

3、MongoDB应用场景

它的应用场景非常广泛,存储数据、读写网站数据、文件存储、日志存储、缓存等。

从数据角度说,mongo关注是未来数据量。

从需求角度说,mongo关注是未来的拓展和维护。

4、术语

mongo从5版本对事务的支持更好,以后工作用的一定是5版本及以上的。

我们学习用4版本,是因为很多电脑安装不了5版本,受硬件影响。4版本和5版本在操作上没有什么大区别,学习不影响。

5、操作

1、安装MongoDB

基于docker的安装,版本号4.4.18

1、查询镜像文件【不操作】

docker search mongo

2、拉取镜像文件

docker pull mongo:4.4.18

3、创建数据挂载目录

mkdir -p /usr/local/docker/mongodb/data

cd /usr/local/docker/mongodb

chmod 777 data

4、启动容器

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

看到此基就启动成功了

--privileged:以真正的有权限方式启动

MONGO_INITDB_ROOT_USERNAME:设置账户

MONGO_INITDB_ROOT_PASSWORD:设置密码

2、验证安装成功

1、命令及说明

# 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,2,3步骤】

【第4-9步骤】

【第10-17步骤】

3、删除用户【不操作】

1、命令及说明

# 进入docker容器
docker exec -it mongodb /bin/bash
# 以root用户登录mongo,-p是密码,--port是端口号,--authenticationDatabase是验证权限的数据库
mongo --port 27017 -u "root" -p "123456" --authenticationDatabase "admin"  
# 切换到dz12b数据库
use dz12b
# 查看所有的用户数据
show users
# 切换到admin数据库
user admin
# 授权
db.auth("root", "123456")
# 删除用户,用户信息再system.users下,remove是一个命令
db.system.users.remove({user:"user01"})
# 重新进入mongo,验证删除成功
exit
mongo --port 27017 -u "root" -p "123456" --authenticationDatabase "admin"  
use dz7b
show users

4、Navicat连接

5、insert

db.dz.insert({name:"菲菲", age:20,sex:"女"});
db.dz.insert({name:"张三",sex:"男"});
db.dz.insert({name:"王五",sex:"男",hiredate:"2024-12-14"});

db.dz.save({name:"菲菲", age:20,sex:"女"});
db.dz.save({name:"张三",sex:"男"});
db.dz.save({name:"王五",sex:"男",hiredate:"2024-12-14"});

insert和save的区别:

如果设置了id字段,id不重复二者没有区别,都是新增一条数据,如果id重复,insert会报错,save执行修改操作。

【执行insert语句同时 创建集合“表”】

db.dz.insert({_id:ObjectId("66f4b95c904baf343400254d"),name:"高波",age:20})
db.dz.save({_id:ObjectId("66f4b95c904baf343400254d"),name:"高波",age:20})

6、find

db.dz.find({age : 20} )
db.dz.find({age : {$gt : 21}})
db.dz.find({age:{$gt : 21},name:'张三'})

7、delete

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

deleteOne是删除按照条件查询到的第一条数据

deleteMany是删除所有符合条件的记录

8、update

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

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

updateOne是修改按照条件查询到的第一条数据

updateMany是修改所有符合条件的记录

9、其他操作【了解】

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

6、SpringBoot整合

1.添加依赖

  <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>

2.添加配置

#username: user01 虚拟机数据库名
#database: 自己数据库的名字
#port: 27017  虚拟机中自己定义的
#host: 192.168.146.128  虚拟机ip
spring:
  data:
    mongodb:
      username: user01
      password: '123456'
      port: 27017
      host: 192.168.146.128
      database: dz14b

mongodb配置有两种方式,如果第一种不生效,可以用第二种尝试一下

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

3.编写Entry

package com.jr.entry;

import lombok.Data;
import org.springframework.data.annotation.Id;

@Data
public class User {

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

4.编写DAO

package com.jr.dao;

import com.jr.entry.User;

import java.util.List;

public interface UserDao {
    /**
     * 新增
     *
     * @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);

}

5.编写DAOImpl

MongoTemplate常用方法:

 mongoTemplate.insert(user);  //添加user对象
 mongoTemplate.findById(id, User.class);  //根据主键id,查询单个user对象。
 mongoTemplate.remove(user);  //删除指定user对象
 mongoTemplate.remove(条件对象Query, User.class);   // 删除符合条件的user对象
 mongoTemplate.updateMulti(条件对象query, 修改对象update, User.class);  //修改符合条件的user对象
 mongoTemplate.find(条件对象query, User.class);  //查询符合条件的user对象

条件对象Query常用方法:

#将构建好的查询条件添加到查询对象中
query.addCriteria(Criteria.where("_id").is(id));

Criteria常用方法:

#用于定义查询条件的接口,它提供了一系列的方法来构建复杂的查询条件。
Criteria.where("_id").is(id);

修改对象Update常用方法:

update.set("password", user.getPassword());

测试代码:

package com.jr.dao.impl;
import com.jr.dao.UserDao;
import com.jr.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 UserDao {

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

6.编写测试类Test

package com.jr;
import com.SpringBootMain;
import com.jr.dao.UserDao;
import com.jr.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 UserDao 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));
    }

}

7.编写启动类

package com;

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);
    }
}

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

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

相关文章

H5响应式的文化传媒娱乐公司HTML网站模板源码

源码名称&#xff1a;响应式的文化传媒娱乐公司HTML网站模板源码 源码介绍&#xff1a;一款自适应H5文化传媒娱乐公司官网源码&#xff0c;源码带有6个H5页面&#xff0c;可用于文化传媒和娱乐公司官网。 需求环境&#xff1a;H5 下载地址&#xff1a; https://www.51888w.c…

【漏洞复现】天融信 运维安全审计系统 synRequest.do 远程命令执行漏洞

免责声明&#xff1a; 本文内容旨在提供有关特定漏洞或安全漏洞的信息&#xff0c;以帮助用户更好地了解可能存在的风险。公布此类信息的目的在于促进网络安全意识和技术进步&#xff0c;并非出于任何恶意目的。阅读者应该明白&#xff0c;在利用本文提到的漏洞信息或进行相关测…

深度学习:自然语言处理的基本原理

概念&#xff1a; 自然语言处理&#xff08;Natural Language Processing&#xff0c;简称NLP&#xff09;是人工智能和语言学领域的一个分支&#xff0c;它致力于研究如何让计算机能够理解、解释和生成人类语言&#xff0c;以及如何实现人与计算机之间的有效通信。自然语言处理…

【AndroidStudio】关于AndroidStudio的常见控件TextView和Button

作者&#xff1a;CSDN-PleaSure乐事 欢迎大家阅读我的博客 希望大家喜欢 使用环境&#xff1a;AndroidStudio 1.常见控件TextView 1.1基本信息 TextView主要用于在界面上显示一段文本信息。最基本的代码格式如下&#xff1a; <TextView android:id"id/text_vie…

Shell 脚本管理 Java 应用程序的高效方法

在软件开发中&#xff0c;管理和监控 Java 应用程序的运行状态变得愈加重要。本文将分享一个自用的简单但高效的 Shell 脚本&#xff0c;帮助轻松管理 JAR 包的启动、停止和日志管理。 脚本功能概述 本脚本提供以下主要功能&#xff1a; 检查 JAR 包的运行状态启动尚未运行的…

OpenHarmony(鸿蒙南向)——平台驱动指南【MIPI DSI】

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… 概述 功能简介 DSI&#xff08;Display Serial Interface&#x…

防火墙的区域划分+来自公网、内网的ip欺骗攻击+防御

一、适用场景&#xff1a; 1、某些企业的WIFI覆盖不全面的情况下&#xff0c;企业职工想通过自己购置的无线路由器实现使用无线WIFI时&#xff0c;无意间接入无线路由器&#xff0c;导致ip欺骗攻击形成。 2、当企业对某个网段中的某些ip地址&#xff0c;限制其不能连外网&…

玩转指针(3)

一、字符指针变量 字符指针变量&#xff08;如char* p&#xff09;的两种赋值方式 ①将字符类型地址赋值给字符指针变量 int main() {char a w;char* p &a;*p m;return 0; }②将常量字符串赋值给字符指针变量 常量字符串的介绍&#xff1a;用" "引起来的就…

【有啥问啥】大型语言模型的涌现能力(Emergent Abilities):新一代AI的曙光

大型语言模型的涌现能力&#xff08;Emergent Abilities&#xff09;&#xff1a;新一代AI的曙光 随着人工智能技术的飞速发展&#xff0c;大型语言模型&#xff08;Large Language Model&#xff0c;LLM&#xff09;展现出了令人惊叹的涌现能力。这种能力并非模型规模简单线性…

OJ在线评测系统 后端 判题机模块预开发 架构分析 使用工厂模式搭建

判题机模块预开发(架构师)(工厂模式) 判题机模块 是为了把代码交个代码沙箱去处理 得到结果返回 代码沙箱 梳理判题模块和代码沙箱的关系 判题模块&#xff1a;调用代码沙箱 把代码和输入交给代码沙箱去执行 代码沙箱&#xff1a;只负责接受代码和输入 返回编译的结果 不负…

mat (Eclipse Memory Analyzer Tool)使用以及详解

前言 在Java开发中&#xff0c;内存问题往往不易被发现&#xff0c;但它们可能导致应用性能下降甚至崩溃。Eclipse Memory Analyzer Tool&#xff08;MAT&#xff09;是一个强大的开源工具&#xff0c;专门用于分析Java堆转储&#xff08;heap dumps&#xff09;文件&#xff…

【含文档】基于Springboot+Vue的高校竞赛管理系统(含源码+数据库+lw)

1.开发环境 开发系统:Windows10/11 架构模式:MVC/前后端分离 JDK版本: Java JDK1.8 开发工具:IDEA 数据库版本: mysql5.7或8.0 数据库可视化工具: navicat 服务器: SpringBoot自带 apache tomcat 主要技术: Java,Springboot,mybatis,mysql,vue 2.视频演示地址 系统定义了三个…

2024四川省赛 The 2024 Sichuan Provincial Collegiate Programming Contest补题记录

B - Link Summon(补) 题意 每一组样例给定五个数字&#xff0c;分别对应1 2 3 4 5的数量&#xff0c;问能凑出多少个6(每个数字都可以当对应数字或者1使用) 思路 由于数字的数量固定&#xff0c;所以为了尽可能凑出多个6&#xff0c;贪心优先选择数量最少的数字配对方式 首…

【移植】标准系统方案之瑞芯微RK3568移植案例(二)

往期知识点记录&#xff1a; 鸿蒙&#xff08;HarmonyOS&#xff09;应用层开发&#xff08;北向&#xff09;知识点汇总 鸿蒙&#xff08;OpenHarmony&#xff09;南向开发保姆级知识点汇总~ 持续更新中…… Camera 基本概念 OpenHarmony 相机驱动框架模型对上实现相机 HDI …

Windows安装Vim,并在PowerShell中直接使用vim

大家好啊&#xff0c;我是豆小匠。 这期介绍下怎么在windows的PowerShell上使用vim&#xff0c;方便在命令行里修改配置文件等。 先上效果图&#xff1a; 1、下载Vim GitHub传送门&#xff1a;https://github.com/vim/vim-win32-installer/releases 选择win-64的版本下载即可&…

【C++篇】深度剖析C++ STL:玩转 list 容器,解锁高效编程的秘密武器

文章目录 C list 容器详解&#xff1a;从入门到精通前言第一章&#xff1a;C list 容器简介1.1 C STL 容器概述1.2 list 的特点 第二章&#xff1a;list 的构造方法2.1 常见构造函数2.1.1 示例&#xff1a;不同构造方法2.1.2 相关文档 第三章&#xff1a;list 迭代器的使用3.1 …

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26

[大语言模型] 情感认知在大型语言模型中的近期进展-2024-09-26 论文信息 Title: Recent Advancement of Emotion Cognition in Large Language Models Authors: Yuyan Chen, Yanghua Xiao https://arxiv.org/abs/2409.13354 情感认知在大型语言模型中的近期进展 《Recent A…

ElasticSearch安装分词器与整合SpringBoot

ElasticSearch安装分词器与整合SpringBoot 如果还没安装的点击安装ElasticSearch查看怎么安装 分词器 1.分词器 在Elasticsearch中&#xff0c;分词器&#xff08;Tokenizer&#xff09;是分析器&#xff08;Analyzer&#xff09;的一部分&#xff0c;它的主要职责是将文本输入…

MySql简介及发展

MySql简介及发展 1、MySql起源和分支 MySQL 是最流行的关系型数据库软件之一&#xff0c;由于其体积小、速度快、开源免费、简单易用、维护成本 低等&#xff0c;在集群架构中易于扩展、高可用&#xff0c;因此深受开发者和企业的欢迎。 Oracle和MySQL是世界市场占比最高的两…

C#图像处理学习笔记(屏幕截取,打开保存图像、旋转图像、黑白、马赛克、降低亮度、浮雕)

1、创建Form窗体应用程序 打开VS&#xff0c;创建新项目-语言选择C#-Window窗体应用&#xff08;.NET Framework) 如果找不到&#xff0c;检查一下有没有安装.NET 桌面开发模块&#xff0c;如果没有&#xff0c;需要下载&#xff0c;记得勾选相关开发工具 接上一步&#xff0c;…