什么是MongoDB
MongoDB 是一个跨平台的,面向文档的非关系型数据库;它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。它支持的数据结构非常松散,是类似JSON 的 BSON 格式,因此可以存储比较复杂的数据类型。
BSON是对JSON的拓展,在JSON的基础上拓展了一些更丰富的语法;
MongoDB 的官方网站地址是:http://www.mongodb.org/
适合使用MongoDB来实现存储的数据特点
(1)数据量大
(2)价值较低
(3)写入操作频繁
例如贴吧,论坛等评论信息;
MongoDB特点
MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。
具体特点总结如下:(了解)
(1)面向集合存储,易于存储对象类型的数据;
(2)模式自由;
(3)支持动态查询;
(4)支持完全索引,包含内部对象;
(5)支持复制和故障恢复;
(6)使用高效的二进制数据存储,包括大型对象(如视频等);
(7)自动处理碎片,以支持云计算层次的扩展性;
(8)支持 Python,PHP,Ruby,Java,C,C#,Javascript,Perl 及 C++语言的驱动程序,社区中也提供了对 Erlang 及.NET 等平台的驱动程序;
(9) 文件存储格式为 BSON(一种 JSON 的扩展);
MongoDB体系结构
MongoDB 的逻辑结构是一种层次结构。主要由:文档(document)、集合(collection)、数据库(database)这三部分组成的。逻辑结构是面
向用户的,用户使用 MongoDB 开发应用程序使用的就是逻辑结构。
(1)MongoDB 的文档(document),相当于关系数据库中的一行记录。
(2)多个文档组成一个集合(collection),相当于关系数据库的表。
(3)多个集合(collection),逻辑上组织在一起,就是数据库(database)。
(4)一个 MongoDB 实例支持多个数据库(database)。文档(document)、集合(collection)、数据库(database)的层次结构如下图:
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-OsLUaJq7-1582108849384)(en-resource://database/2218:1)]
MongoDB与MySQL数据库逻辑结构概念的对比
MongoDB | 关系型数据库Mysql |
---|---|
数据库(databases) | 数据库(database) |
集合(collections) | 表(table) |
文档(document) | 行(row) |
MongoDB数据类型
- null:用于表示空值或者不存在的字段,{“x”:null};
- 布尔型:布尔类型有两个值true和false,{“x”:true};
- 数值:shell默认使用64为浮点型数值。{“x”: 3.14}或{“x”: 3}。对于整型值,可以使用NumberInt(4字节符号整数)或NumberLong(8字节符号整数),{"x:NumberInt(“3”)}{“x”:NumberLong(“3”)};
- 字符串:UTF-8字符串都可以表示为字符串类型的数据,{“x”:“mongoDB”};
- 日期:日期被存储为自新纪元依赖经过的毫秒数,不存储时区,{“x”:new Date()};
- 正则表达式:查询时,使用正则表达式作为限定条件,语法与JavaScript的正则表达式相同,{“x”: /[abc]/};
- 数组:数据列表或数据集可以表示为数组,{“x”: [“a”,“b”,“c”]};
- 内嵌文档:文档可以嵌套其他文档,被嵌套的文档作为值来处理,{“x”:{“y”:3 }};
- 对象Id:对象id是一个12字节的字符串,是文档的唯一标识,{“x”: objectId() };
- 二进制数据:二进制数据是一个任意字节的字符串。它不能直接在shell中使用。如果要将非utf-8字符保存到数据库中,二进制数据是唯一的方式;(基本不用)
- 代码:查询和文档中可以包括任何JavaScript代码,{“x”:function(){/…/}} (基本不用)
window环境下MongoDB的安装
链接:https://pan.baidu.com/s/1Ny_qRhmRB0ijauwzMJwoFg
提取码:bh10
- 网上下载MongoDB软件包,或者使用我提供的网盘链接;
MongoDB将客户端和服务端放在一起,安装时客户端和服务端是一起安装的; - MongoDB的安装比较简单,一直点下一步即可,可以修改一下安装路径;
- 配置环境,为了方便启动,可以将MongoDB配置到环境变量;跟java配置环境变量一样,将MongoDB的bin目录配置到path下;
- 创建一个用于存放数据的目录,在MongoDB下盘创建data文件夹(文件夹任意目录,我的目录D:\software\MongoDB\data)
- 启动服务命令:
mongod --dbpath=D:\software\MongoDB\data - 可以看到MongoDB的启动信息,mongoDB的默认端口是27017,如果想改变启动端口可以通过–port来指定端口;
- 打开新的黑窗口,输入以下命令即可完成登陆
mongo
如果连接远程的MongoDB,可以在后面指定ip地址,端口默认27017
mongo 192.168.0.102 - 退出MongoDB
exit
docker环境下安装MongoDB
- 在宿主机创建mongo容器
docker run ‐di ‐‐name=mongo ‐p 27017:27017 mongo
- 远程登陆
mongo 192.168.0.102
SpringDataMongoDB操作MongoDB
SpringDataMongoDB是SpringData家族成员之一,用于操作MongoDb的持久层框架,封装了底层的mongodb-driver;
1、pom.xml引入依赖
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
</dependency>
2、application.yml添加MongoDB配置:
spring:
data:
mongodb:
host: 192.168.0.102
database: test01
3、Userdao模块继承 MongoRepository
public interface UserDao extends MongoRepository <User,String> {
}
4、service模块依赖Userdao,实现uesr的增删改查,其实跟操作springDataJPA 差不多;
@Service
@Transactional
public class UserService {
@Resource(name = "userDao")
private UserDao userDao;
public List<User> findAll() {
return userDao.findAll();
}
public User findById(String id) {
return userDao.findById(id).orElse(null);
}
public void save(User user) {
userDao.save(user);
}
public void update(User user) {
userDao.save(user);
}
public void deleteById(String id) {
userDao.deleteById(id);
}
/**
* 修改用户状态
* 这种方法虽然实现起来比较简单,但是执行效率并不高
* 因为我只需要将用户状态改成1就可以了,没必要查询出所有字段修改后再更新所有字段
*/
//public void updateStatus(String id){
// User user = userDao.findById(id).get();
// user.setStatus(1);
// spitDao.save(user);
//}
public void updateStatus(String id){
Query query = new Query();
query.addCriteria(Criteria.where("_id").is(id));
Update update = new Update();
update.set("status",1);
mongoTemplate.updateFirst(query,update,"user");
}
}
5、controller直接调用service层