MongoDB介绍和使用

什么是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层

发布了22 篇原创文章 · 获赞 6 · 访问量 496

猜你喜欢

转载自blog.csdn.net/qq_33732195/article/details/104398217