mongoDB 的安装和使用【docker compose,springboot】

news2024/11/23 0:34:43

一 介绍

NoSQL数据库

NoSQL:Not Only SQL ,本质也是一种数据库的技术,相对于传统数据库技术,它不会遵循一些约束,比如:sql标准、ACID属性,表结构等。

Nosql优点

l 满足对数据库的高并发读写

l 对海量数据的高效存储和访问

l 对数据库高扩展性和高可用性

l 灵活的数据结构,满足数据结构不固定的场景

Nosql缺点

l 一般不支持事务

l 实现复杂SQL查询比较复杂

l 运维人员数据维护门槛较高

l 目前不是主流的数据库技术

mongoDB

是一个数据库 ,高性能、无模式、文档性,目前nosql中最热门的数据库,开源产品,基于c++开发。是nosql数据库中功能最丰富,最像关系数据库的

特性

l 面向集合文档的存储:适合存储Bson(json的扩展)形式的数据;

l 格式自由,数据格式不固定,生产环境下修改结构都可以不影响程序运行;

l 强大的查询语句,面向对象的查询语言,基本覆盖sql语言所有能力;

l 完整的索引支持,支持查询计划;

l 支持复制和自动故障转移;

l 支持二进制数据及大型对象(文件)的高效存储;

l 使用分片集群提升系统扩展性;

l 使用内存映射存储引擎,把磁盘的IO操作转换成为内存的操作;

应用场景

MongoDB 的应用已经渗透到各个领域,比如游戏、物流、电商、内容管理、社交、物联网、视频直播等,以下是几个实际的应用案例:

l 游戏场景,使用 MongoDB 存储游戏用户信息,用户的装备、积分等直接以内嵌文档的形式存储,方便查询、更新

l 物流场景,使用 MongoDB 存储订单信息,订单状态在运送过程中会不断更新,以 MongoDB 内嵌数组的形式来存储,一次查询就能将订单所有的变更读取出来。

l 社交场景,使用 MongoDB 存储存储用户信息,以及用户发表的朋友圈信息,通过地理位置索引实现附近的人、地点等功能

l 物联网场景,使用 MongoDB 存储所有接入的智能设备信息,以及设备汇报的日志信息,并对这些信息进行多维度的分析

l 视频直播,使用 MongoDB 存储用户信息、礼物信息等

不适用于

l 高度事务性系统:例如银行、财务等系统。MongoDB对事物的支持较弱;

l 传统的商业智能应用:特定问题的数据分析,多数据实体关联,涉及到复杂的、高度优化的查询方式;

l 使用sql方便的时候;数据结构相对固定,使用sql进行查询统计更加便利的时候;

二 docker compose 安装mongoDB

官网安装方式

docker compose 文件

额外安装一个mongo-express用于ui管理mongodb

services:
  mongodb:
    image: mongo:latest
    container_name: mongodb
    ports:
      - "27017:27017"
    volumes:
      - /home/learning-java/mongodb/store/data:/data/db
      - /home/learning-java/mongodb/store/logs:/var/log/mongodb
    environment:
      MONGO_INITDB_ROOT_USERNAME: root
      MONGO_INITDB_ROOT_PASSWORD: root
    networks:
      - mongodb-net
    healthcheck:
      test: ["CMD", "mongo", "--eval", "db.adminCommand('ping')"]
      interval: 10s
      timeout: 10s
      retries: 5
    
  mongo-express:
    image: mongo-express
    container_name: mongo-express
    ports:
      - 9002:8081
    environment:
      ME_CONFIG_MONGODB_ADMINUSERNAME: root
      ME_CONFIG_MONGODB_ADMINPASSWORD: root
      ME_CONFIG_MONGODB_URL: mongodb://root:root@mongodb:27017/
      ME_CONFIG_BASICAUTH: false
    networks:
      - mongodb-net
    depends_on:
      mongodb:
        condition: service_healthy
networks:
  mongodb-net:
    name: mongodb-net
    driver: bridge

查看是否启动成功

访问ui界面 

 创建完成后,默认有三个数据库,admin、config、local

  • admin:

    • 功能:这是一个特殊的数据库,拥有管理员特权。用户在 admin 数据库中创建后,会被授予对整个 MongoDB 实例的管理权限。
    • 典型用途:用于存储管理员用户以及执行管理命令,如添加或删除用户、设置副本集、配置分片等。
  • local:

    • 功能:这是一个本地数据库,不能被复制到其他服务器上。它存储了与本地服务器实例相关的特定信息。
    • 典型用途:用于存储 oplog(操作日志),当 MongoDB 作为副本集成员时,它用于复制操作。
  • config:

    • 功能:在分片集群环境中使用,存储与分片相关的配置信息。
    • 典型用途:用于存储分片集群的元数据,如分片配置、集群信息等。

用户

在默认情况下,MongoDB 安装时没有预配置任何用户。如果你在启动 MongoDB 实例时没有指定身份验证相关的环境变量或配置选项,则 MongoDB 启动后会在没有任何身份验证的情况下运行,允许任何人访问和修改数据库。

管理员用户

在使用 MONGO_INITDB_ROOT_USERNAMEMONGO_INITDB_ROOT_PASSWORD 环境变量启动 MongoDB 时,会自动创建一个管理员用户。这个用户会有以下属性:

  • 用户名:你在 MONGO_INITDB_ROOT_USERNAME 环境变量中指定的用户名(例如 root)。
  • 密码:你在 MONGO_INITDB_ROOT_PASSWORD 环境变量中指定的密码(例如 root)。
  • 角色:该用户会被赋予 root 角色,该角色在 admin 数据库中拥有完全的管理权限。

 三 springboot 连接数据库

依赖导入

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

配置文件

用户如何配置数据库权限请见后续段落

# ip是mongodb服务器ip,端口取决于你暴露的端口,默认27017,spring-test为数据库
# root用户,密码root
# 需要权限认证,后接参数authSource=admin,代表认证源是admin数据库
# root需要用户配置spring-test数据库权限
spring:
  data:
    mongodb:
      uri: mongodb://root:root@IP:27017/spring-test?authSource=admin
      auto-index-creation: true

创建 实体 User

document 是mongodb注解,代表该类是mongodb的文档,collection表示文档名称

注意:不是collation,是collection

@Data
@Document(collection = "user")
public class User {
    @Id
    private Long id;
    private String username;
    private String password;
}

可以创建一个Repository用于User文档的数据库操作

public interface UserRepository extends MongoRepository<User,Long> {
}

服务

@Service
public class UserService {

    @Resource
    private UserRepository userRepository;

    public User findUserById(Long id){

        Optional<User> byId = userRepository.findById(id);
        //如果为空则抛出异常
        User user = byId.orElseThrow(() -> new RuntimeException("user not found by id:" + id));
        return user;
    }

    public List<User> findAll(){
       return userRepository.findAll();
    }

    public User save(User user){
        return userRepository.save(user);
    }
    public void deleteById(Long id){
        userRepository.deleteById(id);
    }
}

controller

@RestController
public class UserController {

    @Resource
    private UserService userService;

    @GetMapping("/allUser")
    public List<User> findAllUser(){
        return userService.findAll();
    }

    @GetMapping("/findById")
    public User findUserById(@RequestParam("id") @NonNull Long id){
        return userService.findUserById(id);
    }

    @PostMapping("/user")
    public User saveUser(@RequestBody User user){
        return userService.save(user);
    }

    @DeleteMapping("/user")
    public String deleteUserById(@RequestParam("id") @NonNull Long id){
        userService.deleteById(id);
        return "ok";
    }

}

测试

可以插入一个user

然后查询所有用户

查看数据库

附录

如何添加用户数据库权限

使用ui方式添加

选择admin数据库,进入users

可以看到之前创建的root用户

双击进入配置

为spring-test数据库添加读写权限

spring报错  Query failed with error code 2 and error message 'Field 'locale' is invalid in: { locale: "user" }' on server IP:27017

原因:collection和collation

@Document(collation = "user") 错误

正确         

@Document(collection = "user")

collection 属性告诉 Spring Data MongoDB 使用哪个集合来存储和检索该实体类的数据。如果不指定此属性,默认情况下,Spring Data MongoDB 会将实体类的名称作为集合名称

collation 指定 MongoDB 查询的排序规则(collation)。排序规则用于定义如何在查询中处理字符串的比较、排序等操作。它允许你根据语言、区域设置等条件调整查询行为

比如 @Document(collection = "user", collation = "en_US")

  • 排序规则(Collation):包括定义字符串比较规则,如是否区分大小写、是否考虑重音符号、以及排序方式(如字母顺序或自定义规则)。
  • 语言环境collation 可以基于不同的语言和地区设置字符串比较规则。例如,你可以设置 collationfr_FR 来处理法语的字符串排序。

代码仓库

spring-demo: springboot 结合各种插件 demo

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

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

相关文章

思维+dfs,CF 269C - Flawed Flow

一、题目 1、题目描述 2、输入输出 2.1输入 2.2输出 3、原题链接 269C - Flawed Flow 二、解题报告 1、思路分析 考虑源点相连的边的方向是确定的&#xff0c;因为流量是从源点往外流的 我们设cap[u] 为 和u相连边的容量和&#xff0c;显然入边容量要和出边容量相等&…

6.C基础_输入输出函数

putchar 功能&#xff1a;输出一个字符 函数声明&#xff1a; int putchar(int c);返回值&#xff1a;参数c的ASCLL码值 c&#xff1a;要输出的字符&#xff0c;可以为字符常量、字符变量或表达式 注意点&#xff1a;输出的结果不带\n getchar 功能&#xff1a;从键盘读…

Day28 | 56. 合并区间 738.单调递增的数字 968.监控二叉树

语言 Java 56. 合并区间 合并区间 题目 以数组 intervals 表示若干个区间的集合&#xff0c;其中单个区间为 intervals[i] [starti, endi] 。请你合并所有重叠的区间&#xff0c;并返回 一个不重叠的区间数组&#xff0c;该数组需恰好覆盖输入中的所有区间 。 思路 创建…

基于单片机的ELF可执行文件加载以及Bootloader程序实现程序切换

目录 1.ELF可执行文件加载 1.1 ELF文件分类 1.2 ELF文件格式 1.3链接地址 ​编辑 2.Bootloader程序切换 2.1 Bootloader介绍 2.2 代码实现 1.ELF可执行文件加载 ELF&#xff08;Executable and Linkable Format&#xff09;文件是一种标准的文件格式&#xff0c;用于可…

秒懂Linux之编写小程序——进度条

目录 一.前文摘要 二.进度条编写 三全部代码&#xff08;非Linux环境下测试&#xff09; 一.前文摘要 在开始编写之前我们先来学习一些后面会用到的知识点~ 测试结果发现&#xff0c;Sleep无作用&#xff0c;编译完会立刻打印~ 再来看另一个测试~我们同样没有换行&#xff0c…

前后端中的日期格式转换问题

从前端接收到的日期转为想要的格式 JSON日期的反序列化为java对象时 JsonFormat(timezone “GMT8”, pattern “yyyy-MM-dd HH:mm:ss”) 从后端发送的日期转为想要的格式给前端 Java对象中的日期的序列化为JSON时会用到 Date数据序列化为JSON发往前端时&#xff0c;按以下格…

【机器学习西瓜书学习笔记——支持向量机】

机器学习西瓜书学习笔记【第六章】 第六章 支持向量机6.1 间隔与支持向量硬间隔最大化 6.2 对偶问题6.3核函数定义构建核函数应用优劣优势劣势 6.4 软间隔与正则化软间隔正则化 6.5支持向量回归&#xff08;SVR&#xff09;函数间隔和几何间隔SVR的原理SVR数学模型线性硬间隔SV…

The dependencies of some of the beans in the application context form a cycle

你们好&#xff0c;我是金金金。 场景 启动服务时&#xff0c;报错&#xff1a;应用程序上下文中的某些bean的依赖关系形成了一个循环 循环依赖 依赖循环指的是两个或多个类之间相互依赖的情况&#xff0c;即类A依赖类B&#xff0c;同时类B也依赖类A。 这种情况会导致编译器无…

java接口只能定义抽象方法吗?

写在前面 在Java中接口时作为规范来存在的&#xff0c;那么除了抽象方法&#xff0c;接口中还能定义其他方法吗?比如静态方法&#xff1f;本文一起来看下。 1&#xff1a;正文 这并不是一个绝对的是和否的问题&#xff0c;不同的jdk版本表现不同&#xff0c;在<1.7的版本…

用例管理框架

用例管理框架之pytest单元测试框架&#xff08;上&#xff09; 一、pytest用例管理框架&#xff08;单元测试框架&#xff09; 1.分类&#xff1a; python&#xff1a;unittest&#xff0c;pytest 必须非常熟练 2.主要作用&#xff1a; 发现测试用例&#xff1a;从多个py文…

深入理解 C 语言中的联合体

目录 引言 一、 联合体的定义与基本用法 1.联合体的定义 2.基本用法 二、 联合体与结构体的区别 1.结构体 2.联合体 3.对比 ​编辑三、联合体的优势 1. 节省内存 2. 提高效率 3. 代码简洁性 四、联合体的存储细节 1.内存对齐 2.大小计算 五、联合体的高级用法…

Windows内核态开发笔记

文章目录 r3/r0通信x64 HOOK回调监控进程强杀minifilterObRegisterCallbacksWFP后记 r3/r0通信 用户态 #include <Windows.h> #include <stdio.h>#define SENDSTR CTL_CODE(FILE_DEVICE_UNKNOWN, 0x800, METHOD_BUFFERED, FILE_ANY_ACCESS) void main() {HANDLE …

Reader

FileInputStream和FileOutputStream其实还叫字节输入流和字节输出流。关于输入和输出这2个总是有点模糊。 以内存为基准&#xff0c;InputStream是文件流向内存&#xff0c;就是从文件中读取数据&#xff0c;又称为输入流。 OutputStream是从内存中流向文件&#xff0c;就是向…

使用s3cmd 2.x 与 Cyberduck 管理在 DigitalOcean Spaces 对象存储中的数据

有很多用户在使用 DigitalOcean Spaces 对象存储的过程中&#xff0c;还没有找到一个合适的数据管理工具。其实目前有很多开源工具都可以使用&#xff0c;比如 s3cmd、Cyberduck、rclone、transmit5。Cyberduck 提供了直观的图形用户界面&#xff0c;而 s3cmd 2.x 则擅长于批处…

怎么搭建AI带货直播间生成虚拟主播?

随着电商直播带货的热潮不断升温&#xff0c;虚拟主播逐渐崭露头角&#xff0c;成为电商直播领域的新宠&#xff0c;相较于真人主播&#xff0c;虚拟主播具备无档期风险、人设稳定可控、24小时不间断直播等显著优势。 本文将深入探讨如何搭建一个AI带货直播间&#xff0c;并详…

最新小猫咪PHP加密系统源码V1.4_本地API接口_带后台

简介&#xff1a; 最新小猫咪PHP加密系统源码V1.4_完全本地化加密API接口_带后台 小猫咪PHP加密系统历时半年&#xff0c;它再一次迎来更新&#xff0c;更新加密算法&#xff08;这应该是最后一次更新加密算法了&#xff0c;以后主要更新都在框架功能上面了&#xff09;&…

在WordPress上启用reCAPTCHA的指南

随着网络安全问题的日益严重&#xff0c;网站管理员必须采取措施保护自己的网站免受恶意攻击。对于WordPress用户来说&#xff0c;可以通过启用谷歌的reCAPTCHA功能来增强网站的安全性。本文将介绍两种在WordPress上启用reCAPTCHA的方法&#xff1a;使用插件和手动添加代码。 一…

Git基础:使用指南

Git是一个开源的分布式版本控制系统&#xff0c;可以有效、高速地处理从很小到非常大的项目版本管理。分布式相比于集中式的最大区别在于开发者可以提交到本地&#xff0c;每个开发者通过克隆&#xff0c;在本地机器上拷贝一个完整的Git仓库。 一、版本管理 1.1 创建版本库 版…

大模型的架构参数是指定义模型基本结构和组成的各种参数,这些参数对模型的性能、训练效率和泛化能力具有重要影响。以下是对大模型架构参数的详细介绍

大模型架构参数 大模型的架构参数是指定义模型基本结构和组成的各种参数&#xff0c;这些参数对模型的性能、训练效率和泛化能力具有重要影响。以下是对大模型架构参数的详细介绍&#xff1a; 一、基本结构和组成 层数&#xff1a;模型的层数是指模型中全连接网络或特定结构…

vue3直播视频流easy-player

vue3直播视频流easy-player <script src"/easyPlayer/EasyPlayer-element.min.js"></script> easyPlayer文件下载地址 https://download.csdn.net/download/weixin_42120669/89605739 <template><div class"container"><div …