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

一 介绍

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

  • 4
    点赞
  • 14
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值