MongoDB是一个基于分布式文件存储的数据库。由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。它支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。
Mongo最大的特点是它支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
传统的关系数据库一般有数据库(database)、表(table)、记录(record)三个层次概念组成,MongoDB是由数据库(database)、集合(collection)、文档(document)三个层次组成
传统的关系型数据库的查询方式都是SQL,Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。
高性能
MongoDB提供高性能的数据持久化。特别是,
对嵌入式数据模型的支持减少了数据库系统上的I / O操作。
索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。
丰富的查询语言
MongoDB支持丰富的查询语言以支持读写操作(CRUD)以及:数据聚合文本搜索和地理空间查询。
高可用
MongoDB的复制工具(称为副本集)提供:_自动_故障转移、数据冗余。
水平扩展
MongoDB提供水平可伸缩性作为其_核心_ 功能的一部分:
分片将数据分布在一个集群的机器上。
从3.4开始,MongoDB支持基于分片键创建数据区域。在平衡群集中,MongoDB仅将区域覆盖的读写定向到区域内的那些分片。
支持多种存储引擎
MongoDB支持多个存储引擎:WiredTiger存储引擎(包括对静态加密的支持 )
内存存储引擎。
MongoDB支持众多平台
Windows 下安装MongoDB点击这里:https://www.runoob.com/mongodb/mongodb-window-install.html
Linux 下安装MongoDB点击这里:https://www.runoob.com/mongodb/mongodb-window-install.html
?
Spring Data MongDB 是Spring Data的下的一个模块,在SpringBoot中整合MongoDB就需要添加Spring Data MongDB的依赖
?
<!--Spring Data MongoDB依赖-->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-mongodb</artifactId>
<version>2.4.6</version>
</dependency>
SpringBoot默认的配置文件格式是application.properties
,而目前我们比较常用的SpringBoot配置文件格式为yml,所以这里我把配置文件的后缀改为.yml
在application.yml
文件中添加MongoDB的连接参数
spring:
data:
mongodb:
host: 127.0.0.1 #指定MongoDB服务地址
port: 27017 #指定端口,默认就为27017
database: article#指定使用的数据库(集合)
authentication-database: admin # 登录认证的逻辑库名
username: admin #用户名
password: abc123456 #密码
?mongodb数据库与mysql不一样 mysql 一个普通用户可以管理多个数据库,但是mongo每一个库都有一个独立的管理用户,连接时需要输入对应用户密码
@Document,文档是 MongoDB 中最基本的数据单元,由键值对组成,类似于 JSON 格式,可以存储不同字段,字段的值可以包括其他文档,数组和文档数组。
@Id(主键):用来将成员变量的值映射为文档的_id的值
@Indexed(索引): 索引是一种特殊的数据结构,存储在一个易于遍历读取的数据集合中,能够对数据库文档中的数据进行排序。索引能极大提高文档查询效率,如果没有设置索引,MongoDB 会遍历集合中的整个文档,选取符合查询条件的文档记录。这种查询效率是非常低的。
@Field(字段): 文档中的字段,类似于 MySql 中的列。
@Aggregation(聚合): 聚合主要用于数据处理,例如统计平均值、求和等。
/**
* 文章实体类
**/
@Data
@Document(collection = "article") //指定要对应的文档名(表名)
@Accessors(chain = true)
public class Article {
@Id
private String id;//文章主键
private String articleName; //文章名
private String content; //文章内容
}
SpringBoot操作MongoDB有两种方式,分别是继承MongoRepository
类和service注入MongoTemplate
MongoRepository
Repository是用于操作数据库的类
/**
* 继承 MongoRepository<实体类,主键类型>,以实现CRUD
**/
public interface ArticleRepository extends MongoRepository<Article,String> {
//根据id查询文章
List<Article> findByid(String id);
}
?这里遇到一个坑,在创建查询方法时,方法名写的是findByArticleId,运行时报了一个No property articleid found for type Article!的错误,这里是因为创建自定义接口时需要遵守MongoRepository的命名规范,这里我们是根据文章id进行查询,而文章的主键名为id,所以这里接口需要起名findBy + 主键名,否则会报找不到属性的错误。
创建ArticleService.java
接口定义操作方法
public interface ArticleService {
/**
* 添加文章
* @param article
* @return
*/
int create(Article article);
/**
* 删除文章
*/
int delete(List<String> ids);
/**
* 根据id查询
* @param id
* @return
*/
List<Article> list(String id);
}
创建实现类实现ArticleService.java
接口
/**
* ArticleService实现类
**/
@Service
public class ArticleServiceImpl implements ArticleService {
@Autowired
private ArticleRepository articleRepository;
/**
* 添加文章
*
* @param article
* @return
*/
@Override
public int create(Article article) {
Article save = articleRepository.save(article);
return 1;
}
/**
* 删除文章
*
* @param ids
*/
@Override
public int delete(List<String> ids) {
List<Article> deleteList = new ArrayList<>();
for(String id:ids){
Article article = new Article();
article.setId(id);
deleteList.add(article);
}
articleRepository.deleteAll(deleteList);
return ids.size();
}
/**
* 查询文章
* @param id
* @return
*/
@Override
public List<Article> list(String id) {
return articleRepository.findByid(id);
}
}
创建ArticleController.java
控制器
/**
* Web层,实现操作MongoDB
**/
@RestController
@RequestMapping("/article")
@Api(tags = "文章操作")
public class ArticleController {
@Autowired
private ArticleService articleService;
@PostMapping("/create")
@ApiOperation("创建文章")
public String create(@RequestBody Article article) {
int result = articleService.create(article);
if (result > 0) {
return "文章创建成功";
} else {
return "文章创建失败";
}
}
@PostMapping("/delete")
@ApiOperation("批量删除文章")
public String delete(@RequestParam("ids") List<String> ids) {
int count = articleService.delete(ids);
if (count > 0) {
return "删除了" + count + "篇文章";
} else {
return "删除文章失败";
}
}
@PostMapping("/list")
@ApiOperation("查询")
public List<Article> list(String id) {
List<Article> list = articleService.list(id);
return list;
}
}
?
MongoTemplate
package com.ukir.mongo.service.impl;
import com.ukir.mongo.pojo.Article;
import com.ukir.mongo.service.ArticleService2;
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.stereotype.Service;
import java.util.ArrayList;
import java.util.List;
/**
* ArticleService实现类
**/
@Service
public class ArticleServiceImpl2 implements ArticleService2 {
@Autowired
private MongoTemplate mongoTemplate;
/**
* 添加文章
*
* @param article
* @return
*/
@Override
public int create(Article article) {
Article save = mongoTemplate.save(article);
return 1;
}
/**
* 删除文章
*
* @param ids
*/
@Override
public int delete(String id) {
List<Article> deleteList = new ArrayList<>();
Query query = new Query();
query.addCriteria(Criteria.where("id").is(id));
mongoTemplate.remove(query,Article.class);
return 1;
}
@Override
public Article get(String id) {
Article byId = mongoTemplate.findById(id, Article.class);
return byId;
}
}
?