Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >《一起学》mongodb 之第一卷

《一起学》mongodb 之第一卷

作者头像
moon聊技术
发布于 2022-02-17 02:28:50
发布于 2022-02-17 02:28:50
94600
代码可运行
举报
文章被收录于专栏:moon聊技术moon聊技术
运行总次数:0
代码可运行

moon 的开场白

「一起学」》系别终于启动了,这个系列我主要会「按照我学习的思路」,给大家更新一下,为的是「学习方法和思路」,当然重要的还有知识,以及 moon 平常是怎么学习一个新的技术的

初学 mongodb

「新学一个技术应该做什么」

「官方文档」,来,我们一起来看看官方文档是怎么说的

遇事不决,先看简介

这里第一句话很关键,文档上说,mongoDB 是一个文档型数据库,旨在简化开发和扩展」

这里很明显的确定了 mongoDB 的部分优势,那就是「简化开发和扩展」,那它是怎么简化开发和扩展的呢?这就是需要我们后面认真的去研究了。

然后,又提到了一个关键的词,「文档型数据库,好了,到这里没有听过的朋友就蒙了,所以,我们往下看

什么是文档型数据库?

紧接着官方就给了说明,「MongoDB中的记录是一个文档,它是由字段和值对组成的数据结构。MongoDB文档类似于JSON对象。字段的值可以包括其他文档,数组和文档数组」

这句话其实讲的已经非常明了了,它记录的是一个文档,所以相比 Mysql 这种关系型数据库来说,moon 第一个想到的就是,「不用写 DDL 语句来维护表字段的关系了」,文档里面,你想怎么存就怎么存。

后面官方这里提到了文档数据库的「优点」:

  • 1.文档(即对象)对应于许多编程语言中的内置数据类型。

也就是说说文档内的「数据类型是自己定义」的,可以对应不同编程语言中的各种内置数据类型

  • 2.嵌入式文档和数组减少了对昂贵连接的需求。

最直白的说就是类似于 Mysql 当中的 Join 语句少了

  • 3.动态模式支持流畅的多态性。

这句话的 moon 是这样理解的,由于文档内容是自定义的,所以会有各种格式,比如下面这种格式就体现了其多态性

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
普通电话,具有打电话发短信的功能
{
 "type": "basic_phone",
 "message":1,
  "call":1
}
iphone,具有打电话发短信的功能,并且还能玩游戏
{
 "type": "iphone",
 "message":1,
  "call":1,
  "game":1
}

集合/视图/按需实例化视图

MongoDB 将文档存储在集合中。集合类似于关系数据库中的表。

这句话就很好理解了,我就不解释了

除集合外,MongoDB 还支持:

  • 只读视图(从MongoDB 3.4开始),和 SQL 的视图没有什么差异,视图是基于表/集合之上进行动态查询的一层对象,可以是虚拟的,也可以是物理的(物化视图)。
  • 按需实例化视图。从4.2版本开始,MongoDB 为 aggregation pipeline 添加了 $merge 阶段。此阶段可以将管道结果合并到现有集合中,而不是完全替换现有集合。此功能允许用户创建按需物化视图,每次运行管道时都可以更新输出集合的内容。

主要特性

后面就介绍到了 mongoDB 的一些主要特性

  • 高性能
    • 1.对嵌入式数据模型的支持减少了数据库系统上的I / O操作。

「什么是嵌入式的数据模型呢」?

MongoDB 提供高性能的数据持久化。特别是, 对嵌入式数据模型的支持减少了数据库系统上的 I / O 操作(不用连表查询了)。索引支持更快的查询,并且可以包含来自嵌入式文档和数组的键。

「为什么嵌入式模型可以减少数据库系统上的 I / O 操作?」

  • 丰富的查询语言

MongoDB 支持丰富的查询语言以支持读写操作(CRUD)以及:数据聚合 文本搜索和地理空间查询。

「其实数据库的核心作用就是两个,存储+查询」,各种不同的数据库几乎都是围绕着这两个点去设计的,所以查询方式也是非常重要的,MongoDB 并「不支持 sql 语句查询」,但是对于已经熟悉 sql 语句查询的人来说,官方给了我们一个很简单的理解方式,就是 sql 查询和 mongo 查询的对照

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
如上图 https://docs.mongodb.com/v4.2/reference/sql-comparison/

SELECT * FROM people = db.people.find
------------------------------------
SELECT user_id, status FROM people 
= 
db.people.find(
    { },
    { user_id: 1, status: 1, _id: 0 }
)
------------------------------------
SELECT user_id, status FROM people WHERE status = "A"
=
db.people.find(
    { status: "A" },
    { user_id: 1, status: 1, _id: 0 }
)

这样是不是就很容易去理解了

  • 高可用

MongoDB 的复制工具(称为副本集)提供:

1.「自动_故障转移」2.数据冗余

副本集是一组维护相同数据集合的 mongod 实例,提供了冗余和提高了数据可用性

  • 水平拓展

MongoDB 提供水平可伸缩性作为其_核心_ 功能的一部分:分片将数据分布在一个集群的机器上。从 3.4 开始,MongoDB 支持基于分片键创建数据区域。在平衡群集中,MongoDB 仅将区域覆盖的读写定向到区域内的那些分片。

  • 支持多种存储引擎
    • WiredTiger 存储引擎(包括对静态加密的支持)
    • 内存存储引擎。
    • MongoDB 支持多个存储引擎:

另外,MongoDB 提供可插拔的存储引擎 API,允许第三方为 MongoDB 开发存储引擎。

这其实也是「类似于 mysql 存储引擎可拔插的设计」,比较容易理解

架构

作为一个新学习的数据库,「架构图也是我们了解其信息的重要手段之一」

我们可以看到,在 mongoDB 的架构中,核心的有三个组件

  • 数据分片(Shards)
    • 分片用于存储真正的集群数据,可以是一个单独的 Mongod实例,也可以是一个副本集。生产环境下Shard一般是一个 Replica Set,以防止该数据片的单点故障。
    • 对于分片集合(sharded collection)来说,每个分片上都存储了集合的一部分数据(按照分片键切分),如果集合没有分片,那么该集合的数据都存储在数据库的 Primary Shard中。
  • 配置服务器(Config Servers)
    • 保存集群的元数据(metadata),包含各个Shard的路由规则,也包括了 chunk (分片数据块)的信息。
  • 查询路由(Query Routers)
    • Mongos是 Sharded Cluster 的访问入口,其本身并不持久化数据 。Mongos启动后,会从 Config Server 加载元数据,开始提供服务,并将用户的请求正确路由到对应的Shard。
    • Sharding 集群可以部署多个 Mongos 以分担客户端请求的压力。

其实到了这里就基本差不多了,但是为了「加深」我们对于 mongoDB 的「印象」,我会去再看一下,「MongoDB 和 Mysql 到底有什么区别」

MongoDB 和 Mysql 有什么区别

数据库

MongoDB

MySQL

数据库模型

非关系型

关系型

存储方式

bson格式

不同引擎有不同的存储方式

查询语句

MongoDB查询方式

SQL语句

数据处理方式

基于内存,将热数据存放在物理内存中,从而达到高速读写

不同引擎有自己的特点

事务性

仅支持单文档事务操作,弱一致性

支持事务操作

占用空间

占用空间大

占用空间小

join操作

MongoDB没有join

MySQL支持join

总结

以上的知识对于一个新技术的入门来说,肯定是够用了 但是「重点还是在于归纳总结」,当你看完这些知识的时候,你脑海里对它有什么印象

对于 mongoDB ,当你看完这篇文章的时候,你需要知道它是一个

  • 「cp 类型的文档数据库」
  • 它有着自己「独特的数据查询方式」,操作语法是怎样的
  • 它支持「水平扩展」
  • 「自动故障转移和数据冗余(数据分散在不同的 shard 上,有备份)成就了它的高可用」
  • 一个请求打到 mongoDB 中需要一层「路由来将请求映射到具体的数据分片上」
  • 「支持单个文档的事物」。。。。。。

入门就到这里了,后面我们再展开,包括「索引,分片原理,故障转移机制」等等

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2022-01-14,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 moon聊技术 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
访问网站首页 index.php,跟着执行流程走一遍
访问网站首页 index.php,跟着执行流程走一遍,细节不深究,碰到不太明白的变量,直接var_dump()输出看看: 1. index.php——首页入口页面,版本判定、是否开启调试、引入 ThinkPHP框架 路径:‘./index.php‘ 判断PHP版本需是5.3.0以上:version_compare(PHP_VERSION,‘5.3.0‘,‘<‘); 系统调试设置:define(‘APP_DEBUG‘, true ); 应用目录设置:define ( ‘APP_PATH‘, ‘./Application/‘ ); 缓存目录设置:define ( ‘RUNTIME_PATH‘, ‘./Runtime/‘ ); 引入ThinkPHP:require ‘./ThinkPHP/ThinkPHP.php‘; 2. ThinkPHP.php——ThinkPHP框架的入口文件,定义各种常量、判断系统环境,初始化应用 路径:‘./ThinkPHP/ThinkPHP.php‘ 定义常量:版本号 THINK_VERSION、URL 模式定义(4 种模式)、类文件后缀 EXT、是否为SAE 环境、常用的系统路径常量(如Think类库目录、应用公共目录、缓存目录、配置目录等); 引入核心类Think.class.php:require CORE_PATH.‘Think‘.EXT; 应用初始化:Think\Think::start(); //命名空间\类名::方法(); //这里用到了命名空间 3. Think.class.php——框架的核心类,初始化应用程序,加载配置、类库,错误和异常处理,实例化对象 路径:‘./ThinkPHP/Library/Think/Think.class.php‘ 声明:Think\Think start()方法:加载需用的类、配置、语言包,是否需要缓存,运行应用 ①设定方法: spl_autoload_register(‘Think\Think::autoload‘); 自动加载类的方法,以及一些错误异常处理方法; ②分布式存储类初始化,用于读取、写入、删除文件;Storage::connect(STORAGE_TYPE); ③开发模式不缓存加载的核心类文件$runtimefile,用户模式将所有需引用的类并到同一个文件中缓存,加快后续访问速度。 ④加载应用的配置文件、需要的函数和类文件、行文扩展等文件路径的数组$mode;include ‘./ThinkPHP/Mode/common.php‘ ⑤循环加载处理$mode 数组中的各路径的文件; ⑥检查应用目录结构是否存在,不存在则会默认生成目录结构;(这个针对ThinkPHP新建一个应用,首次访问时使用) ⑦开始运行应用 App::run(); 即:‘./ThinkPHP/Library/Think/App.class.php‘ 4. App.class.php——加载公共文件配置、URL解析、调用对应的控制器方法 路径:‘./ThinkPHP/Library/Think/App.class.php‘ 声明:Think\App run()方法: ①App::init(); load_ext_file 加载应用的公共文件(./Application/Common/Common/)配置 (./Application/Common/Conf) Think\Dispatcher::dispatch(); URL解析,获取控制器 index、方法 index ②App::exec(); 执行应用程序,及新建控制器HomeConstroller 的实例,即对象; 创建控制器实例:$module = controller(CONTROLLER_NAME,CONTROLLER_PATH); 即=new IndexController(); 利用 php 反 射 机 制 获 取 action 方 法 对 象 , $method = new \ReflectionMethod($module, $action); 执行这个方法:$method->invoke($module); //无参数时执行,访问首页默认执行这个 $method->invokeArgs($module,$args); //有参数时执行; 以上即执行了控制器 ./Application/Hom
PM吃瓜
2019/08/13
4K0
Github-ThinkPHP 2.X 任意代码执行
ThinkPHP 3.0 版本因为 Lite 模式下没有修复该漏洞,也存在这个漏洞。所以先来看看preg_replace这个函数,这个函数是个替换函数,而且支持正则,使用方式如下:
Baige
2022/03/22
9290
Github-ThinkPHP 2.X 任意代码执行
开发中经常用到的代码
http://surl.sinaapp.com/ 引入百度CDN公共库 地址:http://t.cn/zYDC8wj
老高的技术博客
2022/12/27
4710
ThinkPHP-PHP开发中的主流框架
PHP 中的框架是什么? 框架就是通过提供一个开发 Web 程序的基本架构,PHP 开发框架把 PHPWeb 程序开发摆到了流水线上。换句话说,PHP 开发框架有助于促进快速软件开发(RAD),这节约了开发时间,有助于创建更为稳定的程序,并减少开发者的重复编写代码的劳动。 框架专门用于为这些常用元素(数据库交互、表示层、应用程序逻辑)提供结构,以便可以花费更少的时间来编写数据库接口代码或者表示层接口,而花费更多的时间来编写应用程序本身。以这种方式分解应用程序,这种架构被称为模型-视图-控制器(Mod
沈唁
2018/05/24
2.9K0
PHP-ThinkPHP框架学习
每个项目都有一个独立的配置文件(位于项目目录的Conf/config.php),配置文件的定义格式均采用PHP返回数组的方式,例如:
偏有宸机
2020/11/04
7K0
thinkjs学习笔记
IMWeb前端团队
2017/12/29
1.2K0
thinkPHP3.0框架实现模板保存到数据库的方法
本文实例讲述了thinkPHP3.0框架实现模板保存到数据库的方法。分享给大家供大家参考,具体如下: 在开发cms的时候用到如果将模板文件存入到数据库并显示到页面中 由于thinkphp3.0都是直接从模板文件中读取再解析的那么对于模板存入数据库中就只有自己开发了,还有thinkphp3.0中有mode的功能我们可以定义自己的mode这样就可以达到目的了,那么如何来扩展自己的mode呢?如下: 1.在你的入口文件中输入
用户2323866
2021/07/01
7430
骑士CMS模版注入+文件包含getshell复现
骑士cms人才系统,是一项基于PHP+MYSQL为核心开发的一套免费 + 开源专业人才网站系统。软件具执行效率高、模板自由切换、后台管理功能方便等诸多优秀特点。
Timeline Sec
2020/12/16
1.6K0
ThinkPHP框架运行流程
$GLOBALS['_beginTime'] = microtime(TRUE);
PM吃瓜
2019/08/13
1.2K0
CI基础知识笔记
1.知识点 $config[‘url_suffix’] = ”;//url后缀 $config[‘enable_query_strings’] = FALSE; $config[‘controller_trigger’] = ‘c’;//类似Thinkphp当中的m,可以传递c=news控制器名 $config[‘function_trigger’] = ‘m’;//类似Thinkphp当中的a,可以传递a=index方法名 $config[‘directory_trigger’] = ‘d’;
苦咖啡
2018/05/08
1.4K0
thinkphp框架解析0 -- 起源
THINKPHP是国人开发的PHP框架,如今终于深入内部打探了一番,下面给大家分享老高的心得。
老高的技术博客
2022/12/27
1.3K0
Yaf---Session | 模板 | 模型 | Cli模式
Yaf_Session是Yaf对Session的包装, 实现了Iterator, ArrayAccess, Countable接口, 方便使用.关于Yaf_Session的文档介绍:http://www.laruence.com/manual/yaf.class.session.html
Marco爱吃红烧肉
2021/07/23
2K0
Phalcon VS Spring 用法对照手册
Phalcon VS Spring 摘要 Phalcon VS Spring 用法对照表 ---- 目录 1. Install 1.1. Phalcon 1.2. Spring 2. Project initialization 2.1. Phalcon 2.2. Spring 3. Controller 3.4.1. Phalcon 3.4.2. Spring 3.3.1. Phalcon 3.3.2. Spring 3.2.1. Phalcon 3.2.2. Spring 3.1.1. Phalcon
netkiller old
2018/03/05
1.1K0
Thinkphp的Common模块作用
Common模块和普通模块一样,可以添加控制器、模型和视图,并且支持多层,但不能直接访问,只能继承,其中模型层 可以作为公用模型,在D方法实例化中调用。D函数实例化的时候 才能自动判断 当前模块模型类不存在的时候实例化公共模块中的同名模型,自己实例化肯定做不到这点了。
PM吃瓜
2019/08/12
2.7K0
Thinkphp的Common模块作用
带你走进PHP session反序列化漏洞
前些天打了巅峰极客,遇到了一题 session 反序列化,借此机会整理一下php session 反序列化的前生今世,愿与君共勉,如若有错,还望斧正
p4nda
2023/01/03
1.8K0
Thinkphp框架的项目规划总结和踩坑经验
1、项目分为PC端、移动端、和PC管理端,分为对应目录为 /Application/Home,/Application/Mobile,/Application/Admin;
PM吃瓜
2019/08/12
2.5K0
Thinkphp框架的项目规划总结和踩坑经验
thinkphp3.2.3代码审计
源码地址:http://www.thinkphp.cn/download/610.html
F12sec
2022/12/30
1.2K0
thinkphp3.2.3代码审计
thinkphp常用配置config
下载解压 ThinkPHP 3.2.3,在默认的应用 Application(./Application) 中,包含一个默认的模块 Home(./Application/Home)。
PM吃瓜
2019/08/12
3.1K0
thinkphp常用配置config
骑士 CMS 远程代码执行分析
续师傅前些天跟我说骑士 CMS 更新了一个补丁,assign_resume_tpl 这个全局函数出现了问题,让我分析看看能不能利用,我看了下官网公告:
p4nda
2023/01/03
1.1K0
骑士 CMS 远程代码执行分析
使用easyswoole进行开发web网站
easyswoole作为swoole入门最简单的框架,其框架的定义就是适合大众php,更好的利用swoole扩展进行开发,
仙士可
2019/12/19
1.7K0
使用easyswoole进行开发web网站
相关推荐
访问网站首页 index.php,跟着执行流程走一遍
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
本文部分代码块支持一键运行,欢迎体验
本文部分代码块支持一键运行,欢迎体验