MongoDB入门篇(1)

慕课网视频笔记

1.基础知识

MongoDB是一个基于分布式文件存储的数据库。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最小关系数据库的。

分布式系统:分布式系统(distributed system)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。

分布式计算的优点:

  • 可靠性(容错)
  • 可扩展性
  • 资源共享
  • 灵活性
  • 更快的速度
  • 开放系统
  • 更高的性能

分布式计算的缺点:

  • 故障排除
  • 缺少软件支持
  • 网络基础设置的问题
  • 安全性

NoSQL:指的是非关系型的数据库。NoSQL用于超大规模数据的存储。这些类型的数据存储不需要固定的模式,无需多余操作就可以横向扩展。

RDBMS VS NoSQL

RDBMS:

  • 高度组织化结构化数据
  • 结构化查询语言(SQL)
  • 数据和关系都存储在单独的表中
  • 数据操纵语言,数据定义语言
  • 严格的一致性
  • 基础事务

NoSQL:

  • 代表着不仅仅是SQL
  • 没有声明性查询语言
  • 没有预定义的模式
  • 键-值对存储,列存储,文档存储,图形数据存储
  • 最终一致性,而非ACID属性
  • 非结构化和不可预知的数据
  • CAP定理
  • 高性能,高可用性和可伸缩性

CAP定理(又被称作布鲁尔代理):

  • 一致性(Consistency)(所有节点在同一个时间具有相同的数据)
  • 可用性(Availability)(保证每个请求不管成功或者失败都有响应)
  • 分隔容忍(Partition tolerance)(系统中任意信息的丢失或失败不会影响系统的继续运作)

CAP定理指出对于一个分布式计算系统来说,不可能同时满足上面三点。最多只能同时较好的满足两个。

因此,根据CAP原理将NoSQL数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:

  • CA—单点集群,满足一致性,可用性的系统,通常在可扩展性上不太强大。
  • CP—满足一致性,分区容忍性的系统,通常性能不是特别高。
  • AP—满足可用性,分区容忍性的系统,通常可能对一致性要求低一些。

NoSQL优点:

  • 高扩展性
  • 分布式计算
  • 低成本
  • 架构的灵活性,半结构化数据
  • 没有复杂的关系

NoSQL缺点:

  • 没有标准化
  • 有限的查询功能(到目前为止)
  • 最终一致是不直观的程序

BASE:Basically Available,Soft-state,Eventually Consistent
CAP理论的核心是:一个分布式系统不可能同时很好的满足一致性,可用性和分区容错性这三个需求,最多只能同时较好的满足两个。

BASE是NoSQL数据库通常对可用性及一致性的弱要求原则:

  • Basically Available—基本可用
  • Soft-state—软状态/柔性事务。 “Soft state”可以理解为“无连接”的,而”Hard state”是“面向连接”的。
  • Eventually Consistency—最终一致性,也是是ACID的最终目的。

这里写图片描述

NoSQL数据库分类:

这里写图片描述

MongoDB学习目标:

部署数据库服务:

  • 搭建简单的单机服务
  • 搭建具有冗余容错功能的复制集
  • 搭建大规模数据集群
  • 完成集群的自动部署

MongoDB的使用:

  • 最基本的文档的读写更新删除
  • 各种不同类型的索引的创建与使用
  • 复杂的聚合查询
  • 对数据集合进行分片,在不同分片间维持数据均衡
  • 数据备份与恢复
  • 数据迁移

简单运维:

  • 部署MongoDB集群
  • 处理多种常见的故障
    -单节点失效,如何恢复工作
    -数据库意外被杀死如何进行数据恢复
    -数据库发生拒绝服务如何排查原因
    -数据库磁盘快满时如何处理

MongoDB学习阶段:

  • 初级(背景知识,基本操作)
  • 中级(常见部署操作,简单运维)
  • 高级(介绍集群及大型集群的运维经验及MangoDB的实现原理、常见问题及解决方法)

MongDB运维:

  • 如何运维一个几十T甚至上百T的数据库
  • 如何维持几十甚至上百个节点的数据库的均衡

MongDB常用网站:

  • 1.MongoDB官网: www.mongodb.org
  • 2.MongoDB国内官方网站: www.mongoing.com
  • 3.中文MongoDB文档地址: docs.mongoing.com
  • 4.MongoDB的github: https//github.com/mongodb

为什么选择MongoDB:

  • 1 无数据结构限制(没有表结构的概念,每条记录可以有不同的结构。业务开发方便快捷。sql数据库需要事先定义表结构再使用)
{name:'小明',sex:'男'}
{name:'小红',adress:'上海'}
{name:'小兰',home:[{'山东'},{'江西'}]}
  • 2 完全的索引支持(单键索引,多键索引,数组索引,数据索引,全文索引,地理位置索引)
  • 3 方便的冗余和扩展。(复制集保证数据安全和分页扩展数据规模,每条数据备份3条(一主二从))
  • 4 完善的文档支持,齐全的驱动支持。

MongoDB的主要目标时在键值对存储方式(提供了高性能和高度伸缩性)。
MongoDB适用以下场景:

  • 网站数据:MongoDB非常适合实时的插入,更新与查询,并具备网站实时数据存储所需的赋值及高度伸缩性。
  • 缓存:由于性能很高,MongoDB也适合作为信息基础设施的缓存层。在系统重启之后,由MongoDB搭建的持久化缓存层可以避免下层的数据源过载。
  • 大尺寸、低价值的数据:使用传统的关系型数据库存储一些数据时可能会比较昂贵,在此之前,很多时候程序员往往会选择传统的文件进行存储。
  • 高伸缩性的场景:MongoDB非常适合由数十或数百台服务器组成的数据库,MongoDB的路线图中已经包含对MapReduce引擎的内置支持。
  • 用于对象及JSON数据的存储:MongoDB的BSON数据格式非常适合文档化格式的存储及查询。

MongoDB 的使用也会有一些限制,例如,它不适合于以下几个地方。

  • 高度事务性的系统:例如,银行或会计系统。传统的关系型数据库目前还是更适用于需要大量原子性复杂事务的应用程序。
  • 传统的商业智能应用:针对特定问题的BI (Business Intelligence)数据库会产生高度优化的查询方式。对于此类应用,数据仓库可能是更合适的选择。
  • 需要SQL 的问题

2.Windows下MongoDB安装:

a.官网下载的MongoDB版本安装时候提醒错误C:\Program Files\MongoDB\Server\4.1\bin

我的解决方法是更换版本,可选择版本下载地址:http://dl.mongodb.org/dl/win32/x86_64

b.把bin目录C:\Program Files\MongoDB\Server\4.1\bin添加到环境变量里面,方便服务启动。

附注:MongoDB服务启动有两种方式:一种是直接命令行启动,一种是通过配置文件,注册Windows Service来启动。(c和d是或者的关系,使用其中一种方式就可以了。)

命令行启动方式:
c.之后在C或者D盘根目录新建,data文件夹,然后里面再建db和log文件夹,log下面建立mongod.log文件。

然后,指定数据存放位置和日志存储位置:mongod -dbpath D:\data\db -logpath D:\data\log\mongod.log

然后你可以浏览器输入:localhost:27017就会出现一行文字了。

如何出现端口被占用的情况,可以删除db中的文件重新启动mongodb,尝试进行解决。

然后命令行里面输入mongo就可以启动服务了。

Windows Service启动方式:
d.设置MongoDB启动方式

在data的同级目录新建mongo.config文件;
编辑config文件:
dppath=D:\data
logpath=D:\data\log\momgodb.log

然后,管理员权限打开cmd,运行C:\Pragram Files\MongoDB\Server\3.2\bin>mongod --config D:\data\mongo.config --install

启动服务:net start mongodb

关闭服务:net stop mongodb

卸载服务:sc.exe delete MongoDB

安装配置参考文章:
http://www.runoob.com/mongodb/mongodb-window-install.html
https://www.cnblogs.com/shaosks/p/5776619.html
https://blog.csdn.net/u013451157/article/details/78764210
https://www.imooc.com/notepad/19b7e5
https://www.imooc.com/video/5940

MongoDB可视化工具:
https://blog.csdn.net/qq_32340877/article/details/79142129
http://www.mongoing.com/archives/3651
https://adminmongo.markmoffat.com/docs/
https://github.com/mrvautin/adminMongo
https://blog.csdn.net/chszs/article/details/51348248
https://blog.csdn.net/zhengalen/article/details/51464513

3.MongDB概念解析:

在mongoDB中基本的概念是文档、集合、数据库。

这里写图片描述

一个mongodb中可以建立多个数据库。

MongoDB的默认数据库为”db”,该数据库存储在data目录中。

MongoDB的单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同的数据库也放置在不同的文件中。

-- show dbs 命令可以显示所有数据的列表
> ./mongo
MongoDB shell version: 3.0.6
connecting to: test

> show dbs
local 0.078GB
test  0.078GB

-- 执行 'db' 命令可以显示当前数据库对象或集合
> db
test

-- 运行 'use' 命令,可以连接到一个指定的数据库 
> use local
switched to db local
> db
local 

数据库名是保留的,可以直接访问这些有特殊作用的数据库。

  • admin 从权限的角度来看,这是”root”数据库。要是将一个用户添加到这个数据库,这个用户自动继承所有数据库的权限。一些特定的服务器端命令也只能从这个数据库运行,比如列出所有的数据库或者关闭服务器。
  • local 这个数据永远不会被复制,可以用来存储限于本地单台服务器的任意集合
  • config 当Mongo用于分片设置时,config数据库在内部使用,用于保存分片的相关信息。

文档是一组键值对(key-value)对(即BSON)。

MongoDB的文档不需要设置相同的文档,并且相同的字段不需要相同的数据类型,这与关系型数据库有很大的区别,也是MongoDB非常突出的特点。

一个简单的文档例子如下:

{"site":"www.runoob.com","name":"菜鸟教程"}

需要注意的是:

  • 文档中的键/值对是有序的。
  • 文档中的值不仅可以是双引号里面的字符串,还可以是其他几种数据结构(甚至可以是整个嵌入的文档)。
  • MongoDB区分类型和大小写。
  • MongDB的文档不能有重复的键。
  • 文档的键是字符串。除了少数例外情况,键可以使用任意UTF-8字符。

文档键命名规范:

  • 键不能含有\0(空字符)。这个字符用来表示键的结尾。
  • .和$有特别的意义,只有在特定环境下才能使用。
  • 以下划线”_”开头的键是保留的(不是严格要求的)。

集合就是MongoDB文档组,类似于RDBMS中的表格。

集合存在于数据库中,集合没有固定的结构,这意味着你在对集合可以插入不同格式和类型的数据,但通常情况下我们插入的数据都有一定的关联性。

{"site":"www.baidu.com"}
{"site":"www.google.com","name":"Google"}
{"site":"www.runoob.com","name":"菜鸟教程","num":5}

当第一个文档插入时,集合就会被创建。

合法的集合名:

  • 集合名不能是空字符串”“。
  • 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
  • 集合名不能以”system.”开头,这是为系统集合保留的前缀。
  • 用户创建的集合名字不能含有保留字符。有些驱动程序的确支持在集合名里面包含,这是因为某些系统生成的集合包含该字符。除非你要访问这种系统创建的集合,否则千万不要在名字里出现$。

如下实例:

db.col.findOne()

capped collections

Capped collections就是固定大小的collection。

它有很高的性能以及队列过期的特性(过期按照插入的顺序),有点和“RRD”概念类似。

Capped collections是高性能自动的维护对象的插入顺序。它非常适合类似记录日志的功能,和标准collection不同,你必须要显式的创建一个capped collection,指定一个collection的大小,单位是字节。collection的数据存储空间值提前分配的。

要注意的是指定的存储大小包含了数据库的头信息。

db.createCollection("mycoll",{capped:true,size:100000})
  • 在capped collection中,你能添加新的对象。
  • 能进行更新,然而,对象不会增加存储空间。如果增加,更新就会失败。
  • 数据库不允许进行删除。使用drop()方法删除collection所有的行。
  • 注意:删除之后,你必须显式的重新创建这个collection。
  • 在32bit机器中,capped collection最大存储为1e9个字节。

元数据:

数据库的信息是存储在集合中。它们使用了系统的命名空间:

dbname.system.*

在MongoDB数据库中名字空间.system.*是包含多种系统信息的特殊集合(collection),如下:

  • dbname.system.namespaces 列出所有名字空间
  • dbname.system.indexs 列出所有索引
  • dbname.system.profile 包含数据库概要(profile)信息
  • dbname.system.users 列出所有可访问数据库的用户
  • dbname.local.sources 包含复制对端(slave)的服务器信息和状态

在{{ system.indexs }}插入数据,可以创建索引。但除此之外该表信息是不可变的(特殊的drop index命令将自动更新相关信息)。
{{ system.users }}是可修改的。
{{ system.profile }}是可删除的。

MongoDB数据类型:

  • String
  • Integer
  • Boolean
  • Double
  • Min/Max keys
  • Array
  • Timestamp
  • Object
  • Null
  • Symbol
  • Date
  • Object ID
  • Binary Data
  • Code
  • Regular expression

ObjectId
ObjectId类似唯一主键,可以很快的去生成和排序,包含12bytes,含义是:

  • 前4个字节表示创建unix时间戳,格林尼治时间UTC时间,比北京时间早8个小时。
  • 接下来的3个字节是机器标识码
  • 紧接的两个字节由进程id组成PID
  • 最后三个字节是随机数

MongoDB中存储的文档必须有一个_id键。这个键的值可以是任何文档的,默认是个ObjectId对象。

由于ObjectId中保存了创建的时间戳,所以你不需要为你的文档保存时间戳字段,你可以通过getTimestamp函数来获取文档的创建时间:

var newObject = ObjectId()
newObject.getTimestamp()
> ISODate("2017-11-25T07:21:10Z")

-- ObjectId转为字符串
newObject.str
> 5a1919e63df83ce79df8b38f

字符串:

BSON字符串都是UTF-8编码。

时间戳:

BSON有一个特殊的时间戳类型用于MongoDB内部使用,与普通的日期类型不相关。时间戳是一个64位的值。其中:

  • 前32位是一个time_t值(与Unix新纪元相差得秒数)
  • 后32位是在某秒中操作得一个递增的序数

在单个mongod实例中,时间戳通常是唯一的。

在复制集中,oplog有一个ts字段。这个字段中的值使用BSON时间戳表示了操作时间。

BSON时间戳类型主要用于MongDB内部使用。在大多数情况下的应用开发中,你可以使用BSON日期类型。

日期:

表示当前距离Unix新纪元(1970年1月1日)的毫秒数。日期类型是有符号的,负数表示1970年之前的日期。

var mydata1 = new Date() //格林尼治时间
mydata1
>> ISODate("2018-03-04T14:58:51.233Z")
typeof mydata1
>> object

var mydata2 = ISOData() //格林尼治时间
mydata2
>> ISODate("2018-03-04T15:00:45.479Z")
type mydata2
>> object

这样创建的时间是日期类型,可以使用JS中的Date类型的方法。

返回一个时间类型的字符串:

var mydate1str = mydate1.toString()
mydate1str
>> Sun Mar 04 2018 14:58:51 GMT+0000 (UTC)
typeof mydata1str
>> string 

或者

Date()
>> SUn Mar 04 2018 15:02:59 GMT+0000 (UTC)

猜你喜欢

转载自blog.csdn.net/u014465934/article/details/80727901