MongoDB 是一种面向文档的数据库管理系统,它是一个介于关系型数据库和非关系型数据库之间的产品,MongoDB 功能丰富,它支持一种类似 JSON 的 BSON 数据格式,既可以存储简单的数据格式,也可以存储复杂的数据类型。MongoDB 最大的特点是它支持的查询语句非常强大,并且还支持对数据建立索引。总体来说,MongoDB 是一款应用相当广泛的 NoSQL 数据库。
MongoDB 版本 4.0.0 ,安装环境 CentOS 7
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-4.0.0.tgz
解压,重命名
tar -zxvf mongodb-linux-x86_64-4.0.0.tgz -C /opt/soft/
mv /opt/soft/mongodb-linux-x86_64-4.0.0 /opt/soft/mongodb
进入 MongoDB 目录下,创建两个文件夹 db 和 logs ,分别用来保存数据和日志
mkdir /opt/soft/mongodb/db
mkdir /opt/soft/mongodb/logs
touch /opt/soft/mongodb/logs/mongdb.log
然后进入 bin 目录下,创建一个新的 MongoDB 配置文件 mongo.conf ,文件内容如下
dbpath=/opt/soft/mongodb/db
logpath=/opt/soft/mongodb/logs/mongdb.log
port=27017
fork=true
配置解释:
启动 MongoDB
/opt/soft/mongodb/bin/mongod -f /opt/soft/mongodb/bin/mongo.conf --bind_ip_all
参数解释:
执行 mongo 命令,进入 MongoDB 控制台,输入db.version(),查看版本号
/opt/soft/mongodb/bin/mongo
db.version()
默认情况下,启动后连接的是 MongoDB 中的 test 库,而关闭 MongoDB 的命令需要在 admin 库中执行,因此关闭 MongoDB 需要先切换到 admin 库,然后执行 db.shutdownServer(); 命令,如下
use admin;
db.shutdownServer();
exit
默认情况下,启动的 MongoDB 没有登录密码,在生产环境中非常不安全,但是不同于 MySQL、Oracle 等关系型数据库, MongoDB 中每一个都有独立的密码,在那一个库中创建用户就要在哪一个库中验证密码。要配置密码,首先要创建一个用户,例如在 admin 库中创建一个用户,如下
use admin;
db.createUser({user:"root1",pwd:"root1",roles:[{role:"readWrite",db:"test"}]});
新创建的用户名为 root1 ,密码是 root1 ,roles 表示该用户具有的角色,这里的配置表示该用户对 test 库具有读和写两项权限
用户创建成功后,关闭当前实例,然后重新启动
/opt/soft/mongodb/bin/mongod -f /opt/soft/mongodb/bin/mongo.conf --auth --bind_ip_all
启动成功后,在此进入控制台,然后切换到 admin 库中验证登录(默认连接上的库是 test 库),验证成功后就可以对 test 库进行读写操作了,如下
/opt/soft/mongodb/bin/mongo
use admin;
db.auth("root1","root1")
db.auth(“root1”,“root1”) 返回 1 表示认证成功。
借助于 Spring Data MongoDB ,Spring Boot 为 MongoDB 也提供了开箱即用的自动化配置方案,具体步骤如下:
创建 Spring Boot Web 工程,添加 MongoDB 依赖,如下
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-data-mongodbartifactId>
dependency>
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-webartifactId>
dependency>
在 application.properties 中配置 MongoDB 连接信息
# 验证登录信息的库
spring.data.mongodb.authentication-database=admin
# 要连接的库,认证信息不一定要在连接的库中创建,因此这两个分开配置
spring.data.mongodb.database=test
# mongodb 的连接地址 端口 帐号 密码
spring.data.mongodb.host=ip地址
spring.data.mongodb.port=27017
spring.data.mongodb.username=root1
spring.data.mongodb.password=root1
public class Book{
private Integer id;
private String name;
private String author;
@Override
public String toString() {
return "Book{" +
"id=" + id +
", name='" + name + '\'' +
", author='" + author + '\'' +
'}';
}
public Integer getId() {
return id;
}
public void setId(Integer id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getAuthor() {
return author;
}
public void setAuthor(String author) {
this.author = author;
}
}
BookDao 的定义类似于 Spring Data JPA 中的 Repository 定义
public interface BookDao extends MongoRepository<Book,Integer> {
List<Book> findByAuthorContains(String author);
Book findByNameEquals(String name);
}
简单起见,直接将 BookDao 注入 Controller 进行测试
@RestController
public class BookController {
@Autowired
BookDao bookDao;
@GetMapping("/test1")
public void test1() {
List<Book> books = new ArrayList<>();
Book b1 = new Book();
b1.setId(1);
b1.setName("朝花夕拾");
b1.setAuthor("鲁迅");
books.add(b1);
Book b2 = new Book();
b2.setId(2);
b2.setName("呐喊");
b2.setAuthor("鲁迅");
books.add(b2);
bookDao.insert(books);
List<Book> books1 = bookDao.findByAuthorContains("鲁迅");
System.out.println(books1);
Book book = bookDao.findByNameEquals("朝花夕拾");
System.out.println(book);
}
}
启动项目,localhost:8081/test1,打印日志如下
[Book{id=1, name='朝花夕拾', author='鲁迅'}, Book{id=2, name='呐喊', author='鲁迅'}]
Book{id=1, name='朝花夕拾', author='鲁迅'}
除了继承 MongoRepository 外,Spring Data MongoDB 还提供了 MongoTemplate 用来方便地操作 MongoDB。在 Spring Boot 中,若添加了 MongoDB 相关依赖,而开发者并没有提供 MongoTemplate ,则默认会有一个 MongoTemplate 注册到 Spring 容器中,相关配置源码在 MongoDataAutoConfiguration 类中。因此,用户可以直接使用 MongoTemplate ,在Controller 中直接注入 MongoTemplate 就可以使用,添加如下代码在 controller 中
@Autowired
MongoTemplate mongoTemplate;
@GetMapping("/test2")
public void test2() {
List<Book> books = new ArrayList<>();
Book b1 = new Book();
b1.setId(3);
b1.setName("围城");
b1.setAuthor("钱钟书");
books.add(b1);
Book b2 = new Book();
b2.setId(4);
b2.setName("宋诗选注");
b2.setAuthor("钱钟书");
books.add(b2);
mongoTemplate.insertAll(books);
List<Book> list = mongoTemplate.findAll(Book.class);
System.out.println(list);
Book book = mongoTemplate.findById(3, Book.class);
System.out.println(book);
}
启动项目,localhost:8081/test2,打印日志如下
[Book{id=1, name='朝花夕拾', author='鲁迅'}, Book{id=2, name='呐喊', author='鲁迅'}, Book{id=3, name='围城', author='钱钟书'}, Book{id=4, name='宋诗选注', author='钱钟书'}]
Book{id=3, name='围城', author='钱钟书'}