MongoDB是入门一款比较常见的NoSQL数据库,它以其灵活性、到精可伸缩性和高性能而闻名。入门
MongoDB的到精主要特点是它采用了文档型数据存储模型,允许开发人员以非常自然的入门方式组织和存储数据。
当一些表在MySQL查询效率不高时,到精可以转为MongoDB,入门解决数据多查询慢的情况!
下面我们在详细的了解一下吧!
说到MongoDB,就顺便说一下非关系数据库的常见的几种:
类型 | 名称 | 介绍 |
文档数据库 | MongoDB | 使用BSON(二进制JSON)格式存储数据,适用于半结构化数据和复杂查询。 |
键值数据库 | Redis | 用于缓存和快速数据访问,支持复杂的数据结构,如字符串、列表、哈希等。 |
列式数据库 | ClickHouse | 一个开源的列式数据库管理系统,专门设计用于高性能的数据分析和OLAP(联机分析处理)工作负载。 |
图数据库 | Neo4j | 用于存储和查询图形数据,如社交网络关系、知识图谱等。 |
搜索引擎 | Elasticsearch | 分布式搜索和分析引擎,适用于全文搜索、日志分析和实时数据分析。 |
MongoDB是一个开源的文档型数据库管理系统,它属于非关系型数据库的一种,主要存储半结构化或无结构化数据,并提供灵活的数据建模和查询能力。
MongoDB中的一条记录就是一个文档,它是由字段和值对组成的数据结构。MongoDB 文档类似于 JSON 对象。字段的值可以包括其他文档、数组和文档数组。
使用文档的优点是:
「我们来比对MySQL说一下MongoDB的概念:」
最大的概念数据库其实可以理解为一样的,「只不过MySQL数据库里放的是表,MongoDB里放得是文档集合。」
所以:表(Table)与文档集合(Collection)可以理解类似的,存储的形式不一样
在细化的概念就是:行(Row):行是表中的记录,它们包含特定的字段和值文档(Document):文档是JSON格式的数据,它们包含了数据字段和相应的值
MongoDB 提供高性能的数据持久性。特别是下面两个方面:
MongoDB 查询 API 支持读写操作 (CRUD)以及:
MongoDB 的复制工具称为副本集,它提供:
「副本集是一组维护相同数据集的 MongoDB 服务器,提供冗余并提高数据可用性。」
MongoDB 提供水平可扩展性作为其核心 功能的一部分:
「在平衡集群中,MongoDB 将区域覆盖的读写操作仅定向到该区域内的分片。」
MongoDB 支持多种存储引擎:
「此外,MongoDB提供了可插拔的存储引擎API,允许第三方为MongoDB开发存储引擎。」
「当然有些东西Redis也可以实现,具体情况在根据公司情况进行选择,不要死板哈!」
本次使用Docker安装比较省心,当然也可以下载客户端装在Linux中,不太建议装在Windows中。
不想装虚拟机的话,装也是可以的,就不带大家安装了,直接给地址自行下载哈:
mongodb下载地址:https://www.mongodb.com/try/download/community
目前最新版本:7.0.1
运行命令之前,需要在宿主机上创建文件夹用于挂载数据,创建完文件夹记得给修改权限。
自己测试玩,可以不挂载,生产上也不太建议使用Docker安装!
docker run -d --name mongodb --restart always -p 27017:27017 -v /data/mongo:/data/db mongo
我们没有设置密码,大家也可以设置一下!
刚刚创建的是一个空的数据库,需要我们自己创建一个数据库:
创建完成:
对于数据库API操作大家可以看文档来走一遍,这里就不具体演示,我们还是以在Springboot程序中来使用演示为主:
MongoDB API文档:https://www.mongodb.com/docs/manual/tutorial/insert-documents/
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-data-mongodb</artifactId></dependency>
server: port: 8086spring: data: mongodb: host: 192.168.239.130 port: 27017 database: test
「这里说一下有个特殊点:」在 MongoDB 中,存储在集合中的每个文档都需要一个唯一的 _id字段作为主键。如果插入的文档省略了该_id字段,MongoDB 驱动程序会自动为该字段生成一个_id,还会新增一个_class字段,来存在全类名。如果有个字段为id,也会转化为_id!
这里分为两种使用形式,一种是直接使用MongoTemplate,第二种就是extends MongoRepository<MyDocument, String>,来实现各种API。
这两种方式没有什么区别,不想写一个接口来继承的话,直接使用template也是没问题的!
「制定了MongoRepository<CommonLog, String>就不需要每次操作的时候指定,像MongoTemplate就需要每次操作来指定是那个类。」
我们以第一种来使用,当然第二种的使用也给大家参考:
public interface CommonLogRepository extends MongoRepository<CommonLog, String> { }
简单的写在Controller里了
「新增如果数据库中不存在文档就会自动新增并把记录插入,还是很智能的!」
「新增:」
private final MongoTemplate mongoTemplate;@PostMapping("saveCommonLog")public CommonLog saveCommonLog() { CommonLog commonLog = new CommonLog(); commonLog.setOperIp("127.0.0.1"); commonLog.setBusinessType(1); commonLog.setOperUrl("https://baidu.com"); commonLog.setOperName("我是新增"); commonLog.setTitle("测试第一条记录"); commonLog.setRequestMethod("get"); commonLog.setOperTime(new Date()); return mongoTemplate.save(commonLog);}
@GetMapping("getAllCommonLogs")public List<CommonLog> getAllCommonLogs() { return mongoTemplate.findAll(CommonLog.class);}
@GetMapping("getCommonLogById")public CommonLog getCommonLogById(@RequestParam String id) { return mongoTemplate.findById(id, CommonLog.class);}
@PostMapping("/updateCommonLog")public void updateCommonLog(){ // 第一种 CommonLog commonLog = mongoTemplate.findById("65151ce0112fec57886da00c", CommonLog.class); if (commonLog != null) { commonLog.setOperName("我修改了你"); mongoTemplate.save(commonLog); } // 第二种 Query query = Query.query(Criteria.where("id").is("65151d8f112fec57886da00d")); Update update = new Update().set("requestMethod", "update"); mongoTemplate.updateFirst(query, update, CommonLog.class);}
@DeleteMapping("deleteCommonLogById")public void deleteCommonLogById(@RequestParam String id) { mongoTemplate.remove(Query.query(Criteria.where("id").is(id)), CommonLog.class);}
我们从非关系型数据库为切入点,引入了MongoDB,在进行介绍,着重介绍了特点,还有众多应用场景。
从安装到连接,开始了整合Springboot实战,带大家进行CRUD实战操作。不知道大家有没有对MongoDB有了进一步的了解呢!
「赶快在项目中使用一下吧,有的时候不是需要这个技术来解决什么痛点,有时就是自己想拓展一下自己的技术栈,当然前提是在不影响系统的情况下哈!」
责任编辑:姜华 来源: 小王博客基地 MongoDB数据存储模型(责任编辑:综合)
鹰君(00041.HK)授出499万份购股期权 惟须待承受人接纳方可作实