1.mongo的介绍
数据库,有关系型数据库和非关系型数据库。
关系型数据库(RDBMS)是指采用了关系模型来组织数据的数据库系统。在关系型数据库中,数据以表(table)的形式存储,每个表包含若干行(row)和列(column),并且表与表之间可以通过外键等方式建立关联。最常见的关系型数据库包括 MySQL、PostgreSQL、Oracle、SQL Server 等。
相对应的,非关系型数据库(NoSQL)是指一类不同于传统关系型数据库的数据库管理系统。非关系型数据库不采用传统的表格形式存储数据,而是使用文档、键值对、列族或图等方式组织数据。非关系型数据库通常具有分布式、高可用、横向扩展等特点,适合处理大规模数据和需要高性能的场景。常见的非关系型数据库包括 MongoDB、Cassandra、Redis、Elasticsearch 等。
所以,我们得了解mongo的几个基本的概念(从大到小):用户(user)-->数据库(db)-->
集合(collection)-->文档;
用户不用多说,我们登录admin数据库,然后才可以创建用户,赋予对应的权限。
切换为对应用户之后,就可以创建自己的数据库了。请注意,在操作mongo的时候,数据库存在,就会切换到对应的数据库;如果不存在,就会自动创建一个数据库。
集合,在关系型数据库中对应"表",但是不叫table,而是叫做collection。可以用show collection命令来查看有哪些集合。
文档,在关系型数据库对应字段。因为mongo是非关系型数据库,所以可以随便存值,不用保证每条数据都要用共同的字段。
2.docker安装mongo数据库
1.docker安装
2.打开虚拟机,rz导入文件
3.tar -zxvf java.tar.gz
解压到指定的文件夹
tar -zxvf java.tar.gz -C /usr/java
2.mongo安装
搜索MongoDB镜像
docker search mongo
拉取镜像
docker pull mongo
创建容器
docker run -itd --name mongod -p 27017:27017 mongo:4.2.6 --auth
--auth:要求使用密码登录
进入客户端
docker exec -it mongod mongo admin
第一个mongod:容器名称
第二个mongo:启动mongo客户端
admin表示使用admin数据库做身份验证
创建用户
db.createUser({user:"zsc",pwd:"123456",roles:[{role:"root",db:"admin"}]});
user:用户名
pwd:密码
role:角色
db:所属数据库查看用户: show users 或者 db.system.users.find();
修改用户密码: db.changeUserPassword("用户名", "新密码");Mongo支持的角色
read 允许用户读取指定数据库
readWrite 允许用户读写指定数据库
dbAdmin 允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin 允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin 只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限
readAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase 只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限
root 只在admin数据库中可用。超级账号,超级权限
3.使用
windows开启关闭防火墙
1、打开运行,输入cmd。
2、直接执行命令:
NetSh Advfirewall set allprofiles state on //开启防火墙
NetSh Advfirewall set allprofiles state off //关闭防火墙
docker 进入 mongodb
docker exec -it mongod mongo admin
登录
db.auth("zsc","123456"); show users;查看用户 show dbs; 查看库 show collections;查看文档
对数据库的管理
切换和创建数据库
use 数据库名 存在就切换,不存在就创建 默认不会持久化到硬盘,所以show dbs; 看不见
查看数据库
show dbs;
删除数据库
use 数据库 进入您要删除的数据库 db.dropDatabase(); 不要传任何参数
对集合管理(对应表管理)
创建集合
db.createCollection("tmp");
查看集合
show collections; 集合状态 db.集合名称.stats();
删除集合
db.tmp.drop();
文档管理 (对应数据管理)
mongodb中所有数据都是一个个文档
文档的数据结构和 JSON基本一样。所有存储在集合中的数据都是BSON格式(Binary JSON 的简写)
文档无约束,字段、内容、容量都可以随意写;
insert 新增
db.集合名.insert(); db.item.insert({"name":"大括号代表里面是一个对象"}); 提示:WriteResult({ "nInserted" : 1 }) db.item.insert([{"name":"第一行"},{"name":"第二行"}]); 提示:BulkWriteResult({ "writeErrors" : [ ], "writeConcernErrors" : [ ], "nInserted" : 2, "nUpserted" : 0, "nMatched" : 0, "nModified" : 0, "nRemoved" : 0, "upserted" : [ ] })
3.2以后是新版本。
把insert();拆为了insertOne({});和insertMany([{},{}]);
db.item.insertOne({"name":"插入一个"}); db.item.insertMany([{"name":"插入第一个"},{"name":"插入第二个"}]);
save 保存
(适合做一条数据完整写操作,且包含主键。如果不存在就插入,如果存在就全量替换)
保存可以和新增一样,新增数据
db.item.save({"name":"save一条数据"}); 提示:WriteResult({ "nInserted" : 1 })
也可以进行一条数据修改 (全量覆盖)
首先查看文档中数据 > db.item.find(); { "_id" : ObjectId("6523a1e3536ad0bbc3357c46"), "name" : "大括号代表里面是一个对象" } { "_id" : ObjectId("6523a2a5536ad0bbc3357c47"), "name" : "zsc" } { "_id" : ObjectId("6523a2a5536ad0bbc3357c48"), "name" : "第二行" } { "_id" : ObjectId("6523a5a4849c738f0b308418"), "name" : "插入第二个" } { "_id" : ObjectId("6523a608849c738f0b308419"), "name" : "插入第二个" } { "_id" : ObjectId("6523a639849c738f0b30841a"), "name" : "重新插入第一个" } { "_id" : ObjectId("6523a639849c738f0b30841b"), "name" : "重新插入第二个" } { "_id" : ObjectId("6523a8a5849c738f0b30841c"), "name" : "save一条数据" } 对于“8419”的数据做修改保存 > db.item.save({ "_id" : ObjectId("6523a608849c738f0b308419"), "name" : "错误插入第二个" }); WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) 但是不能对批量做修改,会报错“主键冲突”
上面是为了造一些数据。具体的操作就用程序实现了
3.springboot集成mongo
1.mongo的依赖
<!--mongo的依赖 --> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId> </dependency>
2.mongo 的配置
#mongo的配置 spring.data.mongodb.uri=mongodb://username:password@localhost:27017/?authSource=admin spring.data.mongodb.database=database username:password 表示数据库的用户名和密码 localhost:27017 表示MongoDB服务器的地址和端口号 ?authSource=admin 表示是否验证是在admin数据库 database 表示你要连接的MongoDB数据库名称
3.具体的代码操作是MongoTemplate
请注意,mongoTemplate是要在类中,方法上面引入的
@Resource private MongoTemplate mongoTemplate;
这里代码演示查找,插入和删除
根据id查找的代码如下:
mongoTemplate.findById(toracleDemoUserBO.getUserAddressBO().getUserAdressId(),
UserAddressBO.class, CommonConstant.MONGODB_USER_COLLECTION);
toracleDemoUserBO.getUserAddressBO().getUserAdressId()
:表示找出mongo集合中的唯一键UserAddressId
UserAddressBO.class :表示返回的结果是这个类的样子,里面的字段是一一对应的
CommonConstant.MONGODB_USER_COLLECTION :这是我自定义的一个常量,
具体内容是"user_address",这表示我操作的是mongo数据库中的user_address集合
保存数据如下:
mongoTemplate.save(userAddressPO)
插入数据如下:
mongoTemplate.insert(userAddressPO, CommonConstant.MONGODB_USER_COLLECTION)
userAddressPO : 表示我插入的数据都放在这个对象中
CommonConstant.MONGODB_USER_COLLECTION : 这是我自定义的一个常量,具体内
是"user_address",这表示我操作的是mongo数据库中的user_address集合
根据条件删除的语句如下:
//构造一个查询条件
Query query = new Query();
//添加查询标准:表中的id 和 saveUserAdress对象中的userAddressId相同;
query.addCriteria(Criteria.where("_id").is(saveUserAdress.getUserAddressId()));
//使用remove方法,加入条件
mongoTemplate.remove(query);
请注意:在Criteria的where语句中 得用"_id" 而非 "id",不然是找不到对应字段的。 如有疑问,请用可视化软件比如navicat 连接一下mongo,去观察一下数据库。这个自动生成的唯一标识id,是 " _id"的字样。