是我的学习笔记,也可以是教程
1、说明
这是我第二次学,第一次学的比较粗略,也没留笔记,这次会记一些我觉得需要记录的知识点,大家也可以直接看这个学。
这篇是最基础的一篇,主要是一些概念下篇文章写中
2、不同操作系统的安装教程(放链接)
window:https://www.runoob.com/mongodb/mongodb-window-install.html
Linux:https://www.runoob.com/mongodb/mongodb-linux-install.html
Max OSX:https://www.runoob.com/mongodb/mongodb-osx-install.html
3.关系型数据库和非关系型数据库
3.1 概念
关系型数据库(Relational Database)(RDBMS)和非关系型数据库(Non-relational Database,也常被称为NoSQL数据库)是两种不同的数据存储技术,它们在数据结构、查询方式、扩展性、使用场景等方面各有特点。下面是它们的主要区别:
关系型数据库(Relational Databases)
- 数据结构:基于表格形式存储数据,数据组织成一系列的表格,每个表格由行(记录)和列(字段)组成,通过主键和外键关联不同表格,实现数据间的关系。
- 查询语言:广泛使用SQL(Structured Query Language)进行数据的增删改查,SQL是一种强大且标准化的语言,支持复杂的查询和数据分析。
- 事务处理:强调ACID原则(原子性、一致性、隔离性、持久性),适合需要严格数据一致性的场景,如金融交易系统。
- 扩展性:传统上,关系型数据库扩展性较差,主要是通过增强单个服务器的性能(垂直扩展),但现代数据库也开始支持分布式和水平扩展。
- 成本:可能需要购买许可费用,尤其对于商业数据库,维护成本相对较高,但也有开源免费的选择,如MySQL、PostgreSQL。
非关系型数据库(NoSQL Databases)
- 数据结构:数据模型更加灵活,包括键值对(Key-Value)、文档(Document)、列族(Column-family)、图形(Graph)等多种类型,能够存储非结构化和半结构化数据。
- 查询方式:不依赖于SQL,通常使用API或自定义查询语言,如MongoDB使用的是查询文档的语法。
- 扩展性:设计上更倾向于水平扩展,易于通过添加更多服务器来分散负载,适合大规模数据和高并发读写场景。
- 事务处理:一般不保证严格的ACID特性,更注重性能和可扩展性,适合大数据处理和实时分析(OLAP)场景。
- 成本:多数是非关系型数据库是开源的,部署成本较低,适合初创企业和快速发展的项目。
应用场景
- 关系型数据库适用于需要复杂事务处理、数据间有严格关系、数据一致性要求高的应用,如银行、财务系统、ERP等。
- 非关系型数据库适用于数据模型灵活多变、需要高并发读写、快速响应和大规模数据存储的应用,如社交网络、物联网、内容管理系统、实时分析等。
综上所述,选择关系型还是非关系型数据库应根据具体业务需求、数据的特性和预期的扩展性来决定,两者不是绝对的替代关系,而是根据场景互补使用。
3.2 举例
关系型数据库:
- Oracle
- DB2
- Microsoft SQL Server
- MySQL
- PostgreSQL
- Microsoft Access
- SQLite
- MariaDB
- SAP HANA
- IBM Informix
非关系型数据库:
非关系型数据库的设计多种多样,包括但不限于以下几种类型:
-
键值存储(Key-Value Stores):
- Redis
- Riak
- DynamoDB
-
文档存储(Document-Oriented):
- MongoDB
- CouchDB
- OrientDB
-
列族存储(Column-Family):
- HBase
- Cassandra
- Google Bigtable
-
图形数据库(Graph Databases):
- Neo4j
- JanusGraph
4、Mongo完整术语列表
-
文档(Document):MongoDB 的基本数据单元,通常是一个 JSON-like 的结构,可以包含多种数据类型。
-
集合(Collection):类似于关系型数据库中的表,集合是一组文档的容器。在 MongoDB 中,一个集合中的文档不需要有一个固定的模式。
-
数据库(Database):包含一个或多个集合的 MongoDB 实例。
-
BSON:Binary JSON 的缩写,是 MongoDB 用来存储和传输文档的二进制形式的 JSON。
-
索引(Index):用于优化查询性能的数据结构,可以基于集合中的一个或多个字段创建索引。
-
分片(Sharding):一种分布数据到多个服务器(称为分片)的方法,用于处理大数据集和高吞吐量应用。
-
副本集(Replica Set):一组维护相同数据集的 MongoDB 服务器,提供数据的冗余备份和高可用性。
-
主节点(Primary):副本集中负责处理所有写入操作的服务器。
-
从节点(Secondary):副本集中的服务器,用于读取数据和在主节点故障时接管为主节点。
-
MongoDB Shell:MongoDB 提供的命令行界面,用于与 MongoDB 实例交互。
-
聚合框架(Aggregation Framework):用于执行复杂的数据处理和聚合操作的一系列操作。
-
Map-Reduce:一种编程模型,用于处理大量数据集的并行计算。
-
GridFS:用于存储和检索大于 BSON 文档大小限制的文件的规范。
-
ObjectId:MongoDB 为每个文档自动生成的唯一标识符。
-
CRUD 操作:创建(Create)、读取(Read)、更新(Update)、删除(Delete)操作。
-
事务(Transactions):从 MongoDB 4.0 开始支持,允许一组操作作为一个原子单元执行。
-
操作符(Operators):用于查询和更新文档的特殊字段。
-
连接(Join):MongoDB 允许在查询中使用
$lookup
操作符来实现类似 SQL 的连接操作。 -
TTL(Time-To-Live):可以为集合中的某些字段设置 TTL,以自动删除旧数据。
-
存储引擎(Storage Engine):MongoDB 用于数据存储和管理的底层技术,如 WiredTiger 和 MongoDB 的旧存储引擎 MMAPv1。
-
MongoDB Compass:MongoDB 的图形界面工具,用于可视化和管理 MongoDB 数据。
-
MongoDB Atlas:MongoDB 提供的云服务,允许在云中托管 MongoDB 数据库。
文档——>集合——>数据库
5、基本命令
show dbs
"show dbs" 命令可以显示所有数据的列表。
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> show dbs
local 0.078GB
test 0.078GB
>
db
执行 "db" 命令可以显示当前数据库对象或集合。
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
> db
test
>
use XXX
运行"use"命令,可以连接到一个指定的数据库。
> use local
switched to db local
> db
local
>
以上实例命令中,"local" 是你要链接的数据库。
6、基本组成
6.1数据库命名规范
数据库名可以是满足以下条件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空字符)。
- 应全部小写。
- 最多64字节。
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- admin: 从权限的角度来看,这是"root"数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
- local: 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
- config: 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。
6.2文档
文档是一组键值(key-value)对(即 BSON)。MongoDB 的文档不需要设置相同的字段,并且相同的字段不需要相同的数据类型,这与关系型数据库(RDBMS)有很大的区别。
BSON 与 传统的表格和列结构的区别(RDBMS就用这个)
主要体现在数据结构、存储方式、灵活性以及查询处理上:
-
数据结构:
- 表格和列结构(关系型数据库):在这种模型中,数据被组织成一系列固定的表格,每个表格都有明确的列和数据类型。每一行代表一条记录,每列则代表一种属性或字段。这种结构强调数据的规范化,减少数据冗余。
- BSON:BSON是一种灵活的、自描述的、二进制的数据格式,设计用于高效地存储JSON-like文档。它支持内嵌文档和数组,允许复杂的数据结构,如文档中嵌套文档。BSON不仅包含基本的数据类型(如字符串、数字、布尔值等),还支持更复杂的数据类型,如日期、二进制数据、代码片段等。
-
存储方式:
- 表格和列结构:数据以行列的形式存储,通常在磁盘上按照预定义的模式连续存放。查询时,数据库引擎通过索引来快速定位数据。
- BSON:数据以文档的形式序列化为二进制格式存储,每个文档都是自包含的实体,可以直接读写。MongoDB等使用BSON的数据库会将这些文档存储在集合中,而不是表格中。BSON的二进制格式使得直接读写更为高效,并且能够快速定位文档内的元素,因为它为每个字段提供了预定义长度的信息。
-
灵活性:
- 表格和列结构:较为固定,修改表结构(如添加/删除列)可能需要重新调整整个数据库的架构,影响现有数据。
- BSON:高度灵活,支持动态模式,即文档不需要遵循统一的结构。这意味着同一个集合中的文档可以有不同的字段和结构,适合处理非结构化或半结构化的数据。
-
查询处理:
- 表格和列结构:通常使用SQL进行查询,SQL查询语言强大且标准化,但对复杂的查询和聚合操作可能需要编写较复杂的多表联接查询。
- BSON:MongoDB等NoSQL数据库使用特定的查询语言(如MongoDB的查询语言),它们往往更加面向文档,对于读取和更新嵌套文档等操作更加直观便捷。
- 表格和列结构:通常使用SQL进行查询,SQL查询语言强大且标准化,但对复杂的查询和聚合操作可能需要编写较复杂的多表联接查询。
RDBMS 与 MongoDB 对应的术语
RDBMS | MongoDB |
---|---|
数据库 | 数据库 |
表格 | 集合 |
行 | 文档 |
列 | 字段 |
表联合 | 嵌入文档 |
主键 | 主键 (MongoDB 提供了 key 为 _id ) |
数据库服务和客户端 | |
Mysqld/Oracle | mongodb |
mysql/sqlplus | mongo |
注意
- 文档中的键/值对是有序的。
- 文档中的值不仅可以是在双引号里面的字符串,还可以是其他几种数据类型(甚至可以是整个嵌入的文档)。
- MongoDB区分类型和大小写。
- MongoDB的文档不能有重复的键。
- 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。
文档键命名规范
1、键不能含有\0 (空字符)。这个字符用来表示键的结尾。
2、和$有特别的意义,只有在特定环境下才能使用。
3、以下划线"_"开头的键是保留的(不是严格要求的)。
6.3集合
概念
集合就是 MongoDB 文档组,相当于RDBMS中的表格;
集合存在于数据库中,集合没有固定的结构;
当第一个文档插入时,集合就会被创建。
命名规范
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
- 集合名不能以"system."开头,这是为系统集合保留的前缀。
- 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合中包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。
集合名称不能包含以下保留字符:
\
(反斜线)/
(正斜线).
(点)$
(美元符号,在某些上下文中特别作为操作符使用)- 空字符(空格也是不建议使用的,尽管技术上可以通过转义来实现,但这通常不推荐)
6.4元数据
MongoDB中,元数据指的是关于数据库内部结构和数据集合的信息描述,它是描述数据库对象(如数据库、集合、索引等)的结构化数据。元数据帮助用户和系统理解存储在数据库中的数据是如何组织和管理的,而不直接涉及数据本身的内容。具体来说,MongoDB的元数据可以包括但不限于以下内容:
- 数据库信息:数据库名称、大小、权限设置等。
- 集合信息:集合名称、选项(如是否为固定集合)、索引信息、验证规则等。
- 索引元数据:索引的名称、键模式、是否唯一、是否为稀疏索引等属性。
- 用户和权限元数据:用户账号、角色、访问权限等安全相关信息。
- 操作日志(Oplog)信息:用于复制和恢复的事务日志记录。
- 系统表:MongoDB 使用一些特殊的系统表来存储元数据,例如
system.namespaces
存储了所有数据库和集合的名称空间信息,system.indexes
存储了各个集合的索引信息等。
这些元数据对于数据库的管理和操作至关重要,比如在执行查询优化、权限控制、备份恢复等操作时,系统会依赖这些元数据做出正确的决策。开发人员和管理员可以通过查询这些系统表来获取数据库的结构和状态信息,进而进行监控、维护或进行进一步的数据操作。
6.5MongoDB 数据类型
常用类型汇总
数据类型 | 描述 |
---|---|
String | 字符串。存储数据常用的数据类型。在 MongoDB 中,UTF-8 编码的字符串才是合法的。 |
Integer | 整型数值。用于存储数值。根据你所采用的服务器,可分为 32 位或 64 位。 |
Boolean | 布尔值。用于存储布尔值(真/假)。 |
Double | 双精度浮点值。用于存储浮点值。 |
Min/Max keys | 将一个值与 BSON(二进制的 JSON)元素的最低值和最高值相对比。 |
Array | 用于将数组或列表或多个值存储为一个键。 |
Timestamp | 时间戳。记录文档修改或添加的具体时间。 |
Object | 用于内嵌文档。 |
Null | 用于创建空值。 |
Symbol | 符号。该数据类型基本上等同于字符串类型,但不同的是,它一般用于采用特殊符号类型的语言。 |
Date | 日期时间。用 UNIX 时间格式来存储当前日期或时间。你可以指定自己的日期时间:创建 Date 对象,传入年月日信息。 |
Object ID | 对象 ID。用于创建文档的 ID。 |
Binary Data | 二进制数据。用于存储二进制数据。 |
Code | 代码类型。用于在文档中存储 JavaScript 代码。 |
Regular expression | 正则表达式类型。用于存储正则表达式。 |
非常重要的数据类型简单解释
-
String(字符串): 最常用的数据类型,用于存储文本数据。MongoDB中的字符串使用UTF-8编码。
-
ObjectId(对象ID): 这是一个特殊的数据类型,通常用于文档的
_id
字段作为主键。ObjectId由时间戳、机器标识、进程ID和一个随机数组成,确保了全局唯一性。 -
Document(文档): MongoDB的核心数据结构就是文档,实质上是一个键值对的集合,类似于JSON对象。文档可以嵌套其他文档,形成复杂的数据结构。
-
Array(数组): 允许在一个键下存储多个值,数组中的元素可以是不同类型的数据。
-
Boolean(布尔值): 用于存储逻辑上的真(true)和假(false)。
-
Number(数值): 包括整数(如Int32, Int64)和浮点数(Double)。MongoDB提供了不同的数值类型以满足不同精度和范围的需求。
-
Date(日期): 用来存储时间戳,表示从1970年1月1日UTC时间到现在的毫秒数,适用于记录事件或文档的创建、修改时间。
-
Embedded Documents(内嵌文档): 文档可以作为另一个文档的值嵌入,这使得MongoDB能够以非规范化的方式存储数据,减少关联查询的需求。
-
Null(空值): 表示缺失或未知的值。
-
BinData(二进制数据): 用于存储二进制数据,如图片、文件等。
-
ObjectID(对象ID): 特别提及是因为其在MongoDB中的重要性,作为文档的默认唯一标识符。
-
Regular Expressions(正则表达式): 可以在查询中使用正则表达式来匹配字符串模式。
-
Timestamp(时间戳): 一种特殊类型的时间戳,主要用于复制和乐观锁机制。
7、总结
到这里我认为Mongodb的准备工作已经做完了,下一篇我们开始学习它的命令语句。