https://www.yuque.com/books/share/27406466-0fb6-48da-88db-0270fbeecb8b/zg9z0c
NoSQL 简介
2008 年左右,网站 、 论坛、社交网络开始高速发展,传统的关系型数据库在存储及处理数据的时候受到了很大的挑战 ,其中主要体现在以下几点:
- 难以应付每秒上万次的高并发数据写入 。
- 查询上亿量级数据的速度极其缓慢 。
- 分库、分表形成的子库到达一定规模后难以进一步扩展 。
- 分库、分表 的规则可能会因为需求变更而发生变更。
- 修改表结构困难 。
在数据量暴增的时代,若想用传统的关系型数据库来满足数据高并发读写、巨量数据的存储、数据库的扩展和高可用,则需要增加软硬件的规格,这将大幅提高成本。
为了解决上述问题,必须有一款自废武功,以求在更高层次上突破瓶颈的数据库系统。就像张无忌忘记招式从而学习太极一样,摈弃了固有模式的 MongoDB 才能应对 Facebook 上亿比特的海量数据。
NoSQL(NoSQL = Not only SQL ),意即"不仅仅是SQL",也叫非关系型数据库(non-relational)。
非关系型简单理解就是把数据直接放进一个大仓库,不标号、不连线、单纯的堆起来,从而提高了对海量数据的高性能存储及访问需求。
NoSQL 是一项全新的数据库革命性运动,早期就有人提出,发展至2009年趋势越发高涨。NoSQL 的拥护者们提倡运用非关系型的数据存储,相对于铺天盖地的关系型数据库运用,这一概念无疑是一种全新的思维的注入。
NoSQL 分类
(1)键值数据库
这类数据库主要是使用数据结构中的键 Key 来查找特定的数据Value。
- 优点:在存储时不采用任何模式,因此极易添加数据
这类数据库具有极高的读写性能,用于处理大量数据的高访问负载比较合适。
键值对数据库适合大量数据的高访问及写入负载场景,例如日志系统。
主要代表是 Redis、Flare。
(2)文档型数据库
这类数据库满足了海量数据的存储和访问需求,同时对字段要求不严格,可以随意增加、删除、修改字段,且不需要预先定义表结构,所以适用于各种网络应用。
主要代表是 MongoDB、CouchDB。
(3)列存储型数据库
主要代表是 Cassandra 、Hbase。
这类数据库查找速度快,可扩展性强,适合用作分布式文件存储系统。
(4)图数据库
主要代表是 InfoGrid 、Neo4J 。
这类数据库利用“图结构”的相关算法来存储实体之间的关系信息,适合用于构建社交网络和推荐系统的关系图谱。
NoSQL 与 RDB 该这么选
既然 NoSQL 数据库有这么多的优势,那它是否可以直接取代关系型数据库?
NoSQL 并不能完全取代关系型数据库,NoSQL 主要被用来处理大量且多元数据的存储及运算问题。在这样的特性差异下,我们该如何选择合适的数据库以解决数据存储与处理问题呢?这里提供以下几点作为判断依据。
1、数据模型的关联性要求
NoSQL 适合模型关联性比较低的应用。因此:
- 如果需要多表关联,则更适合用 RDB
- 如果对象实体关联少,则更适合用 NoSQL 数据库
- 其中 MongoDB 可以支持复杂度相对高的数据结构,能够将相关联的数据以文档的方式嵌入,从而减少数据之间的关联操作
2、数据库的性能要求
如果数据量多切访问速度至关重要,那么使用 NoSQL 数据库可能是比较合适的。NoSQL 数据库能通过数据的分布存储大幅地提供存储性能。
3、数据的一致性要求
NoSQL 数据库有一个缺点:其在事务处理与一致性方面无法与 RDB 相提并论。
因此,NoSQL 数据库很难同时满足强一致性与高并发性。如果应用对性能有高要求,则 NoSQL 数据库只能做到数据最终一致。
4、数据的可用性要求
考虑到数据不可用可能会造成风险,NoSQL 数据库提供了强大的数据可用性(在一些需要快速反馈信息给使用者的应用中,响应延迟也算某种程度的高可用)。
一个项目并非只选择一种数据库,可以将其拆开设计,将需要 RDB 特性的放到 RDB 中管理,而其它数据放到 NoSQL 中管理。
什么是 MongoDB
- 官方文档:https://www.mongodb.com/
- MongoDB 是由 C++ 语言编写的,是一个基于分布式文件存储的开源 NoSQL 数据库系统。
- MongoDB 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。
- 这会让曾经使用过关系型数据库的人比较容易上手
- MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
- MongoDB 的查询功能非常强大
- 不仅支持大部分关系型数据库中的单表查询,还支持范围查询、排序、聚合、MapReduce 等
- MongoDB 的查询语法类似于面相对象的程序语言
MongoDB 有哪些特点
- 文档型数据库
- 高性能
- 灵活性
- 可扩展性
- 强大的查询语言
- 优异的性能
- 高性能:支持使用嵌入数据时,减少系统I/O负担,支持子文档查询
- 多种查询类型支持,且支持数据聚合查询、文本检索、地址位置查询
- 高可用、水平扩展:支持副本集与分片
- 多种存储引擎:WiredTiger , In-Memory
MongoDB 发展历史
- 2007年10月,MongoDB 由 10gen 团队所发展
- 2009年2月首度推出 1.0 版
- 2011年9月,发布 2.0 版本
- 分片、复制等功能
- 2015年3月,发布 3.0 版本
- WiredTiger存储引擎支持
- 2018年6月,发布 4.0 版本
- 推出ACID事务支持,成为第一个支持强事务的NoSQL数据库;
- ……
MongoDB 适用于哪些场景
1、需要处理大量的低价值数据,且对数据处理性能有较高要求
比如,对微博数据的处理就不需要太高的事务性,但是对数据的存取性能有很高的要求,这时就非常适合使用 MongoDB。
2、需要借助缓存层来处理数据
因为 MongoDB 能高效的处理数据,所以非常适合作为缓存层来使用。将 MongoDB 作为持久化缓存层,可以避免底层存储的资源过载。
3、需要高度的伸缩性
对关系型数据库而言,当表的大小达到一定数量级后,其性能会急剧下降。这时可以使用多台 MongoDB 服务器搭建一个集群环境,实现最大程度的扩展,且不影响性能。
建议参考官方文档中的安装教程:https://docs.mongodb.com/manual/installation/
- 在 Linux 中安装 MongoDB
- 方式一:使用 Linux 发行版中的包管理器安装,例如 CentOS Linux 中的 yum、Ubuntu 中的 apt
- 方式二:下载安装包手动安装
- 在 macOS 中安装 MongoDB
- 方式一:使用 Homebrew 包管理器安装管理 MongoDB 服务
- 方式二:下载安装包手动安装
- 在 Windows 中安装 MongoDB
- 方式一:使用 .msi 安装程序快速安装
- 方式二:下载安装包手动安装
注意事项
- 关于 MongoDB 的版本号
- MongoDB 版本形式为 X.Y.Z,例如 4.4.2
- 如果 Y 是奇数(例如 4.3),则为开发版,建议开发测试使用
- 如果 Y 是偶数(例如 4.4),则为稳定版,建议生产环境使用
- 从版本 3.2 之后不再支持 32 位操作系统
- 课程中使用到的版本是最新稳定版 4.4
- Windows Server 2019
- Windows 10 / Windows Server 2016
- macOS 10.13 及更高版本
- MongoDB 不支持 WSL(Windows Subsystem for Linux)
安装 MongoDB
这里以 Windows 手动安装 MongoDB 为例。
1、下载 MongoDB 安装包
- https://www.mongodb.com/try/download/community
2、解压压缩包,将解压出来的资源文件放到一个稳定的目录中
3、关于 MongoDB 软件包目录文件
4、将 MongoDB 安装包中的 bin 目录配置到环境 PATH 变量
配置 PATH 环境变量的目的是为了能够在命令行中的任何位置都能够访问到 bin 目录中的可执行程序。
5、确认是否配置成功
- 注意:如果是配置环境变量之前打开的命令行,则需要在配置完环境变量之后将命令行重启才能生效。
启动和停止 MongoDB 数据库服务
- mongod 默认监听 127.0.0.1:27017
- 如果单独执行 mongod,它会默认使用执行 mongod 命令所处磁盘根目录/data/db 作为数据存储目录。
什么是 mongo Shell
- mongo Shell 是 MongoDB 官方提供的一个在命令行中用来连接操作 MongoDB 服务的客户端工具
- 使用 mongo Shell 可以对 MongoDB 数据库进行数据的管理
下载 mongo Shell
-
mongo Shell 包含在 MongoDB 服务器安装中。如果您已经安装了服务器,则 mongo Shell 将安装在与服务器二进制文件相同的位置。
-
另外,如果您想从 MongoDB 服务器上单独下载 mongo shell,可以参考这里: https://docs.mongodb.com/manual/mongo/#download-the-mongo-shell
启动 mongo Shell 并连接到 MongoDB
-
连接默认端口上的本地 MongoDB 服务
-
连接非默认端口上的本地 MongoDB 服务
-
连接远程主机上的 MongoDB 服务
-
连接具有身份认证的 MongoDB 服务
mongo Shell 执行环境
- 提供了 Javascript 执行环境
- 内置了一些数据库操作命令
- show dbs
- db
- use database
- show collections
- …
- 提供了一大堆的内置 API 用来操作数据库
- db.users.insert({ name: ‘Jack’, age: 18 })
退出连接
- exit
- quit()
- Ctrc + C
创建文档
查询文档
读取操作从集合中检索文档;即查询集合中的文档。 MongoDB提供了以下方法来从集合中读取文档:
- db.collection.find(query, projection)
- query :可选,使用查询操作符指定查询条件
- projection :可选,使用投影操作符指定返回的键。查询时返回文档中所有键值, 只需省略该参数即可(默认省略)。
- db.collection.findOne()
有关示例,请参见:
- Query documents
- Query on Embedded/Nested documents
- Query an Array
- Query an Array of Embedded documents
查询所有文档
等价于 SQL 中的 SELECt * FROM inventory 语句
指定返回的文档字段
相等条件查询
等价于 SQL 中的 SELECt * FROM inventory WHERe status = “D”
指定 AND 条件
以下示例检索状态为“ A”且数量小于($ lt)30的清单集合中的所有文档:
该操作对应于以下SQL语句:
指定 OR 条件
指定 AND 和 OR 条件
使用查询运算符指定条件
下面的示例从状态为“ A”或“ D”等于“库存”的清单集中检索所有文档:
完成的查询运算符参考:https://docs.mongodb.com/manual/reference/operator/query/
查询运算符
参考:https://docs.mongodb.com/manual/reference/operator/query-comparison/
查询嵌套文档
- 整个嵌入式文档上的相等匹配要求与指定的 文档完全匹配,包括字段顺序。
查询嵌套字段
要在嵌入式/嵌套文档中的字段上指定查询条件,请使用点符号 (“field.nestedField”)
-
在嵌套字段上指定相等匹配
-
使用查询运算符指定匹配项
-
指定 AND 条件
查询数组
- 匹配一个数组
- 查询数组中的元素
- 为数组元素指定多个条件
-
使用数组元素上的复合过滤条件查询数组
-
查询满足多个条件的数组元素
使用 $elemMatch 运算符可以在数组的元素上指定多个条件,以使至少一个数组元素满足所有指定的条件。 -
通过数组索引位置查询元素
-
通过数组长度查询数组
-
更新文档
更新操作会修改集合中的现有文档。 MongoDB 提供了以下方法来更新集合的文档:
- db.collection.updateOne(<filter>,<update>,<options>)
- db.collection.updateMany(<filter>,<update>,<options>)
- db.collection.replaceOne(<filter>,<update>,<options>)
删除文档
- db.collection.deleteMany()
- db.collection.deleteOne()
参考:
- 在服务端操作 MongoDB:https://docs.mongodb.com/drivers/
- 在 Node.js 中操作 MongoDB:https://docs.mongodb.com/drivers/node/
初始化示例项目
连接到 MongoDB
CRUD 操作
-
创建文档
-
插入一个:
-
插入多个:
-
-
查询文档
-
删除文档
-
修改文档
mongoose 是用来操作 MongoDB 数据库的开源 ORM 框架
- 官方网站:https://mongoosejs.com/
- GitHub 仓库:https://github.com/Automattic/mongoose
快速体验
-
安装:
-
连接数据库:
-
定义 Schema:
-
将 Schema 发布为 Model:
-
使用 Model 操作数据库:
Schemas
参考:https://mongoosejs.com/docs/guide.html
SchemaTypes
参考:https://mongoosejs.com/docs/schematypes.html
Connections
参考:https://mongoosejs.com/docs/connections.html
Models
参考:https://mongoosejs.com/docs/models.html
documents
参考:https://mongoosejs.com/docs/documents.html
Subdocuments
参考:https://mongoosejs.com/docs/subdocs.html
Queries
Validation
Populate
参考:https://mongoosejs.com/docs/populate.html
以上就是本篇文章【MongoDB】的全部内容了,欢迎阅览 ! 文章地址:http://dfvalve.xrbh.cn/quote/5483.html 行业 资讯 企业新闻 行情 企业黄页 同类资讯 网站地图 返回首页 迅博思语资讯移动站 http://keant.xrbh.cn/ , 查看更多