一 介绍
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_USERNAME
和 MONGO_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
可以基于不同的语言和地区设置字符串比较规则。例如,你可以设置collation
为fr_FR
来处理法语的字符串排序。
代码仓库
spring-demo: springboot 结合各种插件 demo