前言
时间也过太快了嘛,一晃上次更新都又过去6个月了,再不更新就变成年更博客了。
对了,第一次疫情也过去了,最近开始二阳了,希望大家能继续挺过去吧
本篇文章初尝试使用ChatGPT进行,博主主要负责排版和总结
引用文章
- 《MongoDB权威指南》
一、简介
1.1什么是MongoDB
chatGPT: MongoDB是一种开源的文档型数据库管理系统,它以高度可扩展性、灵活性和性能而闻名。MongoDB采用了NoSQL(非关系型数据库)的设计理念,以面向文档的方式存储数据
MongoDB中所有的核心设计都是围绕着【高度可扩展性、灵活性和性能】来进行
1.2优势
1.2.1文档存储:
MongoDB使用BSON(二进制JSON)格式存储数据,支持嵌套文档和数组。使用了“文档”来代替“行” 的概念,没有预定义模式,文档中的键值对大小和内容没有进行固定,可以进行快速迭代
1.2.2可拓展性:
MongoDB具有良好的横向扩展性,可通过添加更多服务器节点处理更大的数据量和负载。由于MongoDB是面向文档的数据模型使跨多台服务器拆分数据更加容易。MongoDB 会自动平衡跨集群的数据和负载,自动重新分配文档,并将读写操作路由到正确的机器上
如果想增加存储空间或增加读写操作的吞吐量,那么可以购买额外的服务器,并将它们添加到集群中。这既便宜又便于扩展,但管理 1000 台机器比管理 1 台机器困难得多。
1.2.3高性能:
MongoDB使用内存映射技术,将数据存储在内存中,提供快速的读取和写入操作。其中WiredTiger 存储引擎
中使用了机会锁
1.2.4其他优势
- 强大的查询功能:MongoDB支持灵活的文档查询、范围查询、排序、聚合和地理空间查询等。
- 复制和容错:MongoDB支持数据复制和容错机制,配置多个副本集以确保数据的高可用性和可靠性。
- 分片:MongoDB可将数据分散存储在多个服务器上,实现数据的水平切分,提高系统的扩展性和负载均衡能力。
- 自动分片迁移:MongoDB具备自动分片迁移功能,可在数据量增加或减少时自动调整分片的位置和数据分布。
1.3使用场景
- 处理大量非结构化数据的项目。
- 强调灵活性和可扩展性的项目。
- 大数据分析。
- 实时数据处理。
- 内容管理系统。
- 社交网络应用。
- 日志管理等。
二、核心概念
2.1文档(核心中的核心)
文档是 MongoDB 中的基本数据单元,可以粗略地认为其相当于关系数据库管理系统中的行(但表达力要强得多)
文档是由一组**有序的键值对(类似于 JSON)**集合组成,通常包含一个或多个键值对,如:
{"greeting" : "Hello, world!", "views" : 3}
其中键是字符串类型。除了少数例外的情况,可以使用任意 UTF-8 字符作为键。
注意:
- 在同个文档中不能包含相同的键
- MongoDB 会区分类型和大小写,见下面描述
类型不同,所以下述是两个文档
{"count" : 5}
{"count" : "5"}
=========================
大小写不同,所以下述是两个文档
{"count" : 5}
{"Count" : 5}
2.2集合
集合就是一组文档。如果将文档比作关系数据库中的行,那么一个集合就相当于一张表。
集合具有动态模式的特性。这意味着文档可以在同一个集合中存储不同结构的文档,如:
{"greeting" : "Hello, world!", "views": 3}
{"signoff": "Good night, and good luck"}
2.2.1那为什么需要多个集合?
-
数据分离:当你的应用程序需要处理具有不同结构或不同用途的数据时,将其分开存储在不同的集合中可以更好地组织数据。这样做可以提高查询效率,并使数据模型更加清晰和易于管理。
-
安全性和权限控制:使用多个集合可以更好地控制对数据的访问权限。你可以为每个集合设置不同的权限和安全策略,以确保只有特定用户或角色可以访问特定集合中的数据。
-
性能优化:当数据集增长到巨大规模时,查询和索引操作可能会变得更加复杂和耗时。通过将数据分散到多个集合中,可以更好地利用硬件资源和并行处理能力,提高数据库的性能和响应速度。
-
数据生命周期管理:在一些应用中,数据的生命周期可能会有不同的阶段,例如原始数据、处理数据、归档数据等。通过使用多个集合,可以更好地管理数据的生命周期,并根据需要进行数据迁移和清理。
-
跨多租户应用:如果你的应用是一个多租户应用,即为多个独立的客户提供服务,使用多个集合可以帮助实现数据的逻辑隔离,每个客户拥有自己独立的数据集合,以确保数据的安全性和隐私。
2.3数据库
MongoDB 使用集合对文档进行分组,使用数据库对集合进行分组。一个 MongoDB 实例可以承载多个数据库,每个数据库有零个或多个集合。
一般来说:将单个应用程序的所有数据都存储在同一个数据库中
2.4数据类型
字符串:用于存储文本数据,最长可以达到16MB。
数值:包括整数和浮点数。整数可以是32位或64位,而浮点数可以是单精度(32位)或双精度(64位)。
布尔值:用于表示真或假。
日期时间:表示日期和时间,以毫秒为单位存储自Unix纪元以来的时间戳。
Null值:表示空值或缺失值。
数组:表示一组有序值的列表。
内嵌文档:表示嵌套在文档中的另一个文档,可以嵌套多层。
二进制数据:用于存储二进制数据,如图像、视频和声音等。
除此之外,MongoDB还支持特殊数据类型,如ObjectId类型,它是一个12字节的唯一标识符,通常用于文档的_id字段。还有正则表达式类型,用于存储正则表达式,以及JavaScript代码类型,用于在MongoDB服务器端执行JavaScript代码。
2.4.1特殊说明
数组:
MongoDB可以对数组进行查询并使用其内容创建索引,还允许使用原子更新来修改数组的内容。
内嵌文档:
可以使数据组织的方式更加自然,而不仅仅是键 – 值对这样的扁平结构,如
{
"name" : "John Doe",
"address" : {
"street" : "123 Park Street",
"city" : "Anytown",
"state" : "NY"
}
}
与数组一样,MongoDB“理解”内嵌文档的结构,并能够在其中创建索引、执行查询或进行更新。
ObjectId和_id:
每个文档都必须有一个唯一的 “_id” 键。“_id” 的值可以是任何类型,但其默认为 ObjectId。
ObjectId 占用了 12 字节的存储空间,组成方式如下
其中值得注意的是:ObjectId值包含时间戳信息,因此可以按照生成时间的先后顺序进行排序。这在一些应用场景中非常有用,例如按时间查询文档或获取最新的文档。
三、小结
本篇文章主要介绍了MongoDB的一些优势特点和一些核心概念和术语,我们将在后续进行学习MongoDB的CRUD操作