MongoDB:原来我如此简单
为什么要使用 MongoDB
张三大学毕业设计题目是《XXX博客论坛》,他在存储用户评论的时候遇到了一个问题:这些评论数据量非常大,但是价值不是很大,如果存储在 MySQL 数据库中就会浪费性能。
李四在工作过程中遇到一个需求:在审批模块中,每一个公司都可以自定义请假类型,例如调休、出差等。相当于给每个公司维护一个自己的数据字典。
张三的痛点是存储的博客评论数据量大但是价值不大,不适合使用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 数据库逻辑结构概念的对比
MongoDB | MySQl |
---|---|
数据库(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
@Repository
public 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;
@Service
public 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 列
@Configuration
public 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);
}
MongoDB:原来我如此简单的更多相关文章
- python操作三大主流数据库(7)python操作mongodb数据库①mongodb的安装和简单使用
python操作mongodb数据库①mongodb的安装和简单使用 参考文档:中文版:http://www.mongoing.com/docs/crud.html英文版:https://docs.m ...
- MongoDB下载安装与简单增删改查
Windows下MongoDB的安装和配置.启动和停止 下载地址:MongoDB的官方下载网址是:https://www.mongodb.org/downloads 安装步骤1. 点击下载的mongo ...
- mongodb 安装与启动简单使用
环境:mac 10.11.6 一.安装步骤:按照官网的教程: 1.打开终端 安装或升级brew: brew update 2.安装mongoDB二进制文件: brew install mongodb ...
- 使用虚拟机在ubuntu下搭建mongoDB开发环境和简单增删改查操作
最近在折腾mongodb和nodejs,在imooc上找了一个mongodb的入门教程,跟着里面一步一步的走,下面记录下我操作的步骤和遇到的问题. 课程地址:http://www.imooc.com/ ...
- MongoDB批量导入及简单的性能优化
今天简单分享一下MongoDB使用过程中的一些性能优化,其实并不只适用MongoDB,其他数据库多少也可适用. 首先先随机导入一千万条数据.这里我分段导入的,因为mongo的BsonDocument一 ...
- MongoDB下Map-Reduce使用简单翻译及示例
目录 Map-Reduce JavaScript 函数 Map-Reduce 行为 一个简单的测试 原文地址https://docs.mongodb.com/manual/core/map-reduc ...
- Mongodb系列- java客户端简单使用(CRUD)
Mongodb提供了很多的客户端: shell,python, java, node.js...等等. 以 java 为例实现简单的增删改查 pom文件: <dependencies> & ...
- MongoDB和关系型数据库简单对比
MongoDB 是一个跨平台的,面向文档的数据库,提供高性能,高可用性和可扩展性方便. MongoDB 工作在收集和文件的概念. 数据库:数据库是一个物理容器集合.每个数据库都有自己的一套文件系统上的 ...
- MongoDB快速入门学习笔记2 MongoDB的概念及简单操作
1.以下列举普通的关系型数据库和MongoDB数据库简单概念上的区别: 关系型数据库 MongoDB数据库 说明 database database 数据库 table collection 数据库表 ...
- mongodb基础整理篇————简单介绍[一]
前言 简单介绍一下文档数据库. 正文 mongodb 是一个以json为数据模型的文档数据库. 这里要介绍一下什么是json.因为有些人认为'{a:1,b:2}' 是json,而"this ...
随机推荐
- linux系统重启网卡后网络不通(NetworkManager篇)
一.故障现象 RHEL7.6系统,使用nmcli绑定双网卡后,再使用以下命令重启network服务后主机网络异常,导致无法通过ssh远程登录系统. # systemctl restart n ...
- hadoop目录结构
Hadoop目录结构 重要目录结构: bin目录:存放对Hadoop相关服务(HDFS,YARN)进行操作的脚本 etc目录:Hadoop的配置文件目录,存放Hadoop的配置文件 lib目录:存放H ...
- Docker-ce Centos8 笔记一:安装Docker-ce
Docker是一个建设企业及数据中心服务仓库的进程,通过裸金属机和虚拟机承载的MAC.windows和linux系统提供本地和远程软件服务,涉及应用软件镜像.系统镜像.虚拟化仓库(虚拟机).它承载着灵 ...
- 剑指offer 面试题6:从尾到头打印链表
题目描述 输入一个链表,按链表值从尾到头的顺序返回一个ArrayList. 编程思想 从前往后遍历,将值存入栈中,然后打印栈中内容即可. 编程实现 /** * struct ListNode { * ...
- LeetCode198--打家劫舍问题
题目 你是一个专业的小偷,计划偷窃沿街的房屋.每间房内都藏有一定的现金,影响你偷窃的唯一制约因素就是相邻的房屋装有相互连通的防盗系统,如果两间相邻的房屋在同一晚上被小偷闯入,系统会自动报警. 给定一个 ...
- Java Mybatis快速入门之基本使用
目录 搭建环境 编写 Mybatis 核心配置文件 pom导出资源失败 测试 搭建环境 新建Maven项目 导入Maven依赖 <dependencies> <!--mysql驱动- ...
- 【Spring】Spring中的Bean - 2、Baen的实例化 (构造器、静态工厂、实例工厂)
Bean的实例化 文章目录 Bean的实例化 构造器实例化 静态工厂方式实例化 实例工厂方式实例化 简单记录-Java EE企业级应用开发教程(Spring+Spring MVC+MyBatis)-S ...
- zabbix_server上的问题
不要写成127.0.0.1,要不然一直包zabbix agent没有启动.
- 【Linux】扩大swap分区
今天安装oracle的时候,提示我swap分区过小.需要最少3g以上 但是安装系统了,想要扩大swap分区怎么办呢 下面来介绍如何扩大swap分区 按步骤介绍 Red Hat linux 如何增加sw ...
- Sentinel上下文创建及执行
Sentinel上下文创建及执行,入口示例代码: public static void fun() { Entry entry = null; try { entry = SphU.entry(SOU ...