2021-02-03

MongoDB:原来我如此简单


为什么要使用 MongoDB

  1. 张三大学毕业设计题目是《XXX博客论坛》,他在存储用户评论的时候遇到了一个问题:这些评论数据量非常大,但是价值不是很大,如果存储在 MySQL 数据库中就会浪费性能。

  2. 李四在工作过程中遇到一个需求:在审批模块中,每一个公司都可以自定义请假类型,例如调休、出差等。相当于给每个公司维护一个自己的数据字典。

张三的痛点是存储的博客评论数据量大但是价值不大,不适合使用Mysql存储。李四的痛点是需要维护一个数据字典,不适合用关系型数据局。为了解决张三和李四的痛点,这个时候非关系型文档型数据库 MongoDB 闪亮登场。

MongoDB 介绍

1. 什么是 MongoDB

MongoDB是一个跨平台的,面向文档的数据库,是当前NoSQL数据库产品中最热门的一种。它介于关系数据库和非关系数据库之间,是非关系数据库当中功能最丰富,最像关系数据库的产品。

2. MongoDB 特点

MongoDB 最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。它是一个面向集合的,模式自由的文档型数据库。具体特点总结如下:
(1)面向集合存储,易于存储对象类型的数据
(2)模式自由
(3)支持动态查询
(4)支持完全索引,包含内部对象
(5)支持复制和故障恢复
(6)使用高效的二进制数据存储,包括大型对象(如视频等)
(7)支持 Python,Java,C,Javascript,Perl及 C++ 语言的驱动程序
(9)文件存储格式为 BSON(一种 JSON 的扩展)

3. MongoDB 结构

MongoDB 的逻辑结构是一种层次结构。主要由:文档 (document)、集合(collection)、数据库 (database) 这三部分组成的。
(1)MongoDB 的文档,相当于关系数据库中的一行记录。
(2)多个文档组成一个集合,集合相当于关系数据库的表。
(3)多个集合逻辑上组织在一起,就是数据库。

4. MongoDB 与 MySQL 数据库逻辑结构概念的对比

MongoDBMySQl
数据库(database)数据库(database)
集合(Collection表(table)
文档(document)行(row)
主键,MongoDB默认将_id设为主键主键
索引索引

5.MongoDB 层次结构如下图

安装 MongoDB

1. Docker安装MongoDB

启动MongoDB服务

 docker run -itd --name mongo -p 27017:27017 mongo --auth

注:1. 如果是购买的服务器,请将安全组的27017端口打开。 2. -p 27017:27017 :容器服务的 27017 端口映射到服务器的27017端口。外部可以直接通过服务器 ip:27017 访问到 mongodb 的服务。
--auth:需要密码才能访问。

2. 创建账户

##进入到容器内部docker exec -it mongo mongo admin##创建系统管理员db.createUser({ user:'admin',pwd:'123456',roles:[ { role:'userAdminAnyDatabase', db: 'admin'},"readWriteAnyDatabase"]});##验证账户密码db.auth('admin', '123456')##创建其他数据库use ems##在该数据库下创建其他账户db.createUser({ user: 'root', pwd: 'abc123456', roles: [ { role: "readWrite", db:"ems" } ] });##验证账户密码db.auth('root', 'abc123456')

3. Navicat 客户端连接 MongoDB

创建数据库

SpringBoot 整合 MongoDB

1. 添加依赖

<!-- MongoDB--><dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId>  </dependency>

2. 修改 SpringBoot 配置文件

spring: data: mongodb:  uri: mongodb://root:123456@localhost:27017/test

账户:root
密码:123456
数据库:test

3. 创建实体类

import lombok.Data;import lombok.EqualsAndHashCode;import lombok.experimental.Accessors;import org.springframework.data.annotation.Id;import org.springframework.data.mongodb.core.mapping.Document;/** * 常用收款人 */@Data@EqualsAndHashCode(callSuper = false)@Accessors(chain = true)@Document(collection = "common_account")public class CommonAccount { @Id private String id; //公司id private Integer companyId; //付款人 private String payer; //银行 private String bank; //分支行 private String bankBranch; //账号 private String bankNum;}

关键注解:1. @Document(collection = "common_account")
@Document表示这是一个集合,当你保存数据的时候如果你没有创建集合,他会自动给你创建一个名为 common_account 的集合。2. @Id:随机生成id

4. 创建 Repository

@Repositorypublic interface CommonAccountRepository extends MongoRepository<CommonAccount, String> { //获取该公司的所有常用收款人账户 List<CommonAccount> getByCompanyId(Integer companyId);}

extends MongoRepository:通过继承 MongoRepository 可以使用它很多常用的方法。

5. 创建 Service

public interface CommonAccountService { //获取该公司的收款账户 List<CommonAccount> getCommonAccount(Integer companyId); //添加收款账户 void addCommonAccount(CommonAccount commonAccount); //更新收款账户 void updateCommonAccount(CommonAccount commonAccount); //删除收款账户 void deleteCommonAccount(String id);}

6. Service 实现类

import org.springframework.beans.factory.annotation.Autowired;import org.springframework.data.mongodb.core.MongoTemplate;import org.springframework.data.mongodb.core.query.Criteria;import org.springframework.data.mongodb.core.query.Query;import org.springframework.data.mongodb.core.query.Update;import org.springframework.stereotype.Service;import java.util.List;@Servicepublic class CommonAccountServiceImpl implements CommonAccountService { @Autowired private CommonAccountRepository commonAccountRepository; @Autowired private MongoTemplate mongoTemplate; @Override public List<CommonAccount> getCommonAccount(Integer companyId) {  List<CommonAccount> accountList = commonAccountRepository.getByCompanyId(companyId);  return accountList; } @Override public void addCommonAccount(CommonAccount commonAccount) {  commonAccountRepository.save(commonAccount); } @Override public void updateCommonAccount(CommonAccount commonAccount) {  Query query = Query.query(Criteria.where("id").is(commonAccount.getId()));  Update update = new Update();  update.set("companyId", commonAccount.getCompanyId());  update.set("payer", commonAccount.getPayer());  update.set("bank", commonAccount.getBank());  update.set("bankBranch", commonAccount.getBankBranch());  update.set("bankNum", commonAccount.getBankNum());  mongoTemplate.updateFirst(query, update, CommonAccount.class); } @Override public void deleteCommonAccount(String id) {  commonAccountRepository.deleteById(id); }}

7. 去除 _class 列

mongoDB 保存数据的时候默认会新增一个 _class 列,如下图:

添加如下配置,去除_class 列

@Configurationpublic class MongoConfig { /**  * 去掉_class  * @param factory  * @param context  * @param beanFactory  * @return  */ @Bean public MappingMongoConverter mappingMongoConverter(MongoDatabaseFactory factory, MongoMappingContext context, BeanFactory beanFactory) {  DbRefResolver dbRefResolver = new DefaultDbRefResolver(factory);  MappingMongoConverter mappingConverter = new MappingMongoConverter(dbRefResolver, context);  try {   mappingConverter.setCustomConversions(beanFactory.getBean(MongoCustomConversions.class));  } catch (NoSuchBeanDefinitionException ignore) {  }  mappingConverter.setTypeMapper(new DefaultMongoTypeMapper(null));  return mappingConverter; }}

8. 测试

 @Test void mongoTest() {  CommonAccount commonAccount = new CommonAccount();  commonAccount.setPayer("张三").setBank("交通银行").setBankBranch("北京路分行")    .setBankNum("61262663265362").setCompanyId(100);  commonAccountService.addCommonAccount(commonAccount); }

微信公众号:eclipse编程。专注于编程技术分享,坚持终身学习。









原文转载:http://www.shaoqun.com/a/523521.html

跨境电商:https://www.ikjzd.com/

barclays:https://www.ikjzd.com/w/2775

upc:https://www.ikjzd.com/w/111


为什么要使用MongoDB张三大学毕业设计题目是《XXX博客论坛》,他在存储用户评论的时候遇到了一个问题:这些评论数据量非常大,但是价值不是很大,如果存储在MySQL数据库中就会浪费性能。李四在工作过程中遇到一个需求:在审批模块中,每一个公司都可以自定义请假类型,例如调休、出差等。相当于给每个公司维护一个自己的数据字典。张三的痛点是存储的博客评论数据量大但是价值不大,不适合使用Mysql存储。李四
ola:ola
bestbuy:bestbuy
世界首富易主!LV总裁取代姐夫成新首富:世界首富易主!LV总裁取代姐夫成新首富
壹堂客:壹堂客
(精品分析)亚马逊德国站狗玩具类目市场调查数据报告:(精品分析)亚马逊德国站狗玩具类目市场调查数据报告

No comments:

Post a Comment