mongodb是使用c++编写的面向文档存储的数据库,它支持一种类似JSON的BSON数据格式,既可以存储简单的数据格式,也可以存储复杂的数据格式。它支持的查询语言非常强大,同时还支持对数据建立索引来实现更快的排序。
一、mongodb安装
1.下载mongodb
执行命令:wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz
下载mongodb,此时可能有报错:
网上有人说加上--no-check-certificate
,即使用命令wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz --no-check-certificate
,试了下我这块不行,最后升级了下wget:yum -y update wget
,再次执行命令,下载正常了。
下载好之后,解压下载文件:tar -zxvf mongodb-linux-x86_64-4.0.0.tgz
将解压好的文件移动到安装目录:mv mongodb-linux-x86_64-4.0.0 /usr/local/mongodb
2.配置mongodb
进入mongodb目录下,创建data和log文件夹,分别用于保存数据和日志:
cd /usr/local/mongodb/
mkdir data
mkdir log
进入bin目录下,创建一个新的mongodb的配置文件mongodb.conf
,文件内容如下:
dbpath=/usr/local/mongodb/data
logpath=/usr/local/mongodb/log/mongodb.log
port=27017
fork=true
各项配置的含义:
dbpath:数据存储目录
logpath:日志文件位置
port:启动端口号
fork:表示以守护进程方式启动mongodb,即允许mongodb在后台运行
3.启动和关闭mongodb
(1)启动mongodb
进入mongodb的bin目录下,运行如下命令启动mongodb:./mongod -f mongodb.conf --bind_ip_all
其中:-f
指定了配置文件的位置,--bind_ip_all
表示允许所有远程地址连接该mongodb实例。出现如下回显信息,则表明mongodb启动成功,守护进程号为8838.
(2)通过mongdb后台管理shell登录
进入mongdb的bin
目录下,执行./mongo
登录后台shell,此时将默认连接mongdb的test库,输入db.version()
命令查看mongodb版本号,同时因为mongodb shell是一个javascripte shell,所以以可以进行简单的数学运算:
(3)关闭mongodb数据库
启动mongodb后默认连接的是test库,而关闭mongodb需要在admin库中执行,所以首先切换数据库,再关闭,命令如下:
use admin;
db.shutdownServer();
exit
回显如下信息,表明数据库已经关闭
4.mongodb安全管理
(1)添加用户
前面登录数据库,都是直接登录,没有使用密码,这对于生产环境而言很不安全,鉴于安全因素,我们需要对mongodb设置密码。不同于mysql,oracel等关系型数据库,mongodb中每一个库都有自己独立的密码,在哪个库创建用户就要在哪一个库验证密码。可以使用如下命令进行创建:
use admin;
db.createUser({user:"adminuser",pwd:"123456",roles:[{role:"userAdminAnyDatabase",db:"admin"}]});
执行以上命令后,会有如下回显信息:
刚才创建的用户adminuser的角色是userAdminAnyDatabase,它可以用来创建删除用户,要对数据库进行存取数据操作,还需要在test库创建一个用户testuser,使它具有读写权限:
use test;
db.createUser({user:"testuser",pwd:"123456",roles:[{role:"readWrite",db:"test"}]});
设置密码后,停止该数据库实例:
use admin;
db.shutdownServer();
exit
通过如下命令启动,开启认证:./mongod -f mongodb.conf --auth --bind_ip_all
注:关于用户角色,有如下几种:
1. 数据库用户角色:read、readWrite;
2. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
3. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
4. 备份恢复角色:backup、restore;
5. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
6. 超级用户角色:root
// 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
7. 内部角色:__system
具体作用如下:
Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限
(2)验证
登录mongodb后台shell后,输入命令查看数据库:show dbs;
提示认证失败,此时需要切换到admin库下面,进行认证:
use admin;
db.auth("adminuser","123456");
这时候再次输入命令,正常返回数据。
接下来验证一下用户权限,首先使用adminuser登录admin库,然后执行插入数据的命令:
use admin;
db.auth("adminuser","123456");
db.abc.insert({"a":1,"b":2});
此时有报错:
切换到testuser,执行插入命令:
use test;
db.auth("testuser","123456");
db.abc.insert({"a":1,"b":2});
数据插入成功:
5.mongodb常用操作
(1)show dbs
: 查看所有数据库,只显示了含有数据的数据库,不含数据的数据库需要增加数据后才能显示;
(2)db
:查看当前数据库名称;
(3)use local
:使用local数据库,同时,如果使用的数据库不存在,则会自动创建数据库;
(4)db.dropDatabase()
:删除当前数据库;
(5)show collections
(show tables
):查看当前数据库中所有的集合名称;
(6)db.createCollection(name, options)
:创建集合,如db.createCollection("mycol", { capped : true, autoIndexId : true, size : 6142800, max : 10000 } )
表示创建结合名为mycol,集合固定大小为6142800kb,文档最大个数为1000个。
(7)db.collectionName.drop()
:删除名称为collectionName的集合
(8)db.collection.insert()
:向collection的集合中插入数据,如果collection不存在,则会自动创建collection集合,然后再添加数据,如db.abc.insert({"a":1,"b":3});
表示向名称为abc的集合里添加一条{"a":1,"b":3}
。
(9)db.collection.find()
:查询collection集合中的所有的文档,如果加入参数,则查询指定参数值的文档,如:db.abc.find({"a":1});
表示查询所有文档中a=1的文档
(10)db.collection.update()
以及db.collection.save()
均用于更新数据,update()
方法是按照传入的数据更新原有文档,save()
方法是直接替换原有文档。
二、springboot集成mongodb
1.引入maven依赖
在springboot项目根pom文件中引入如下依赖:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2.配置mongodb
在application.yml中配置mongod连接信息,配置项如下:
spring:
data:
mongodb:
uri: mongodb://testuser:123456@192.168.184.128:27017/test
3.创建User实体类:
public class User {
private Long id;
private String name;
private Byte sex;
private String phone;
private Byte age;
private Boolean status;
private String address;
//getter setter
}
4.创建controller用于测试:
@RestController
@RequestMapping(value = "/test/mongodb")
public class MongodbTestController {
@Autowired
private MongoTemplate mongoTemplate;
@GetMapping(value = "/writeAndRead")
public void insertUser(){
List<User> userList=new ArrayList<User>();
User user01=new User();
user01.setName("张三");
user01.setId(1L);
user01.setStatus(false);
user01.setAge((byte)18);
user01.setPhone("1234567890");
User user02=new User();
user02.setId(2L);
user02.setName("李四");
user02.setSex((byte)2);
user02.setPhone("09876543212");
user02.setAddress("陕西");
userList.add(user01);
userList.add(user02);
mongoTemplate.insertAll(userList);
//查询所有数据
List<User> allUser = mongoTemplate.findAll(User.class);
System.out.println("allUser="+allUser);
//查询id=2的数据
User userById = mongoTemplate.findById(2, User.class);
System.out.println("userById="+userById);
}
}
5.启动应用进行测试
启动时候发现报错:
尝试了很多方法无效后,最终升级了spring-boot-starter-parent的版本,由2.0.4.RELEASE升级到2.1.0.RELEASE后解决该问题。
服务正常启动后,浏览器访问:https://localhost:8081/test/mongodb/writeAndRead,查看IDEA控制台输出:
可以看到,两条数据已经全部插入到数据库,并且可以正常查询数据库中所有的数据,同时,可以按照id查询某一条记录。