MongoDB入门篇-安装及概念

随着分布式的发展,传统数据库越来越无法支撑大型并发场景下的数据存储,Nosql数据库占据的比重越来越大,其中MongoDB则是文档数据库的代表

MongoDB入门

MongoDB是一款强大、灵活,并且易于扩展的通用型文档数据库。其自身可以扩展出很多强大的功能,比如二级索引、范围查询、排序、聚合、地理空间索引等。

MongoDB的特点

易于使用:MongoDB是一个面向文档的数据库,而不是传统的关系型数据库。这样的好处自然能带来更优秀的扩展性,与传统关系型数据库比,面向文档的数据库没有的概念,与之对应的称之为文档,而通过在文档中嵌入文档和数组的方式来记录一条数据,因此MongoDB中也不再有预定义模式,即文档中的键和值不再是固定的类型和固定的大小,MongoDB不限制每个文档的键值对关系与文档的键值对数量,因此我们在操作文档进行增删变得更加简单了。

易于扩展:由于现在程序中的数据量越来越大,而数据库面临着一个选择,如何扩展数据库?如果是纵向扩展数据库的话,一般都是换更强的机器,而横向扩展一般是选择将内容拆分多个分区,在多个机器上分散,纵向的压力在于升级机器需要更大的成本,而横向往往会带来更多的分布式集群问题,给管理和开发带来更大的麻烦。MongoDB基于横向扩展设计,面向文档模型使得能很容易的在多台服务器上分布和迁移,而MongoDB自身能自动处理跨集群的数据,重新分配文档,因此当我们需要扩容时,只需要增加一台机器,MongoDB会自动完成很多管理。

高性能:MongoDB设计之初就是为了满足分布式存储环境下的高性能,MongoDB对文档进行动态填充,并且预分配数据文件使得可以利用额外空间换取稳定性能,并且在有索引的情况下,MongoDB会尽可能的多利用内存来实现索引的缓存,提高索引的效率。

MongoDB基础概念

在MongoDB中有一些最常见的基础概念,如下:

文档:文档是MongoDB数据库中的基本单元,可以类比为关系型数据库中的行

集合:集合在MongoDB中用来定义和承载对应的文档集合,对应关系型数据库中的表

实例:在MongoDB中也保持了和类似关系型数据库中的数据库(database)的概念,每个'数据库'可以有独立的多个集合,而这种数据库在MongoDB中称之为实例

_id:在关系型数据库中,常见的表结构中都会有一个id的字段作为主键,用来实现索引,并且每个表中id不允许为空和重复,而在MongoDB中,每个文档中也会有一个隐式的id键,如果我们指定了就会按照指定的值设置,如果没有指定,则会自动生成一个不重复的值作为—id的值

文档

文档是MongoDB的核心组件之一,而每一个文档就是键值对的有序集,每种语言的文档可能不一样,比如在java中文档可能就是Map,在其他语言中也有Hash作为文档的,在JavaScript中,文档则表现为对象的形式,比如:

{"greeting":"hello,zhangsan"}

而通常情况下我们的文档会包含多个键值对,每个键对应的值可以是不同类型,但是文档的键必须是字符串格式,键的定义不可以是以下几种情况:

1)键中包含\0,\0在文档中表示键的结尾

2).和$在文档结构中有特殊的意义,不建议在键中使用这两个特殊字符

除此之外,我们还要注意,mongoDB的文档虽然不在乎键值对的顺序,但是键和值的大小写是区分的,比如以下两种是完全不同的两个文档

{"foo":3}
{"foo":"3"}

并且在MongoDB的文档中,不能出现一样的键,因为文档本身不依赖顺序来查找对应的值,但是却需要依赖键来查找对应的值,如果允许出现重复的键,则会导致一系列的程序问题

集合

集合就是一类文档的组,如果说MongoDB中的文档等于关系型数据库中的行的话,那么集合就等同于关系型数据库中的表结构。在MongoDB中集合是动态模式的,即不限制文档内容必须一致,因此我们可以存放不同键值对的文档到同一个集合中,那么我们为何需要多个集合呢?只使用一个集合不也可以完成所有的文档操作吗?这里我们需要思考,如果所有的文档都存放一个集合中,会带来什么样的问题:

1.对于文档管理者或者开发者来说,操作难度变大,比如开发者可能希望每次查询返回的内容都是一样的格式,尤其是在强语言类型的情况下,例如java语言开发者,需要固定的格式传输和接受,因此当集合中出现多种不同格式的文档的时候,需要额外筛选文档,增加工作负担

2.MongoDB本身支持各种索引,而索引本身就是使用了文档的结构,而且索引是基于集合来建立的,因此当集合中都是同样格式的文档时,才能发挥出索引的效率

3.在一个集合中如果混入了大量的不同类型的文档,会比单一类型的集合查找起来更麻烦,相比较之下,单一类型的集合查找时需要的磁盘寻址操作会更少,效率会更高

因此,建议使用MongoDB的时候,我们可以尽量使用同一个模式,把一个类型的文档集合在一起,发挥出MongoDB的优势。集合在创建时,命名建议也要有一定的规范,不建议以下几种特殊情况的命名出现:

1)与文档的键命名一样,集合的命名中不要出现""或者\0这类代表空字符或者集合结束的字符

2)自己管理的集合不要命名为system.作为前缀,因为该命名是系统自带集合使用的前缀,例如system.users这个集合保存着整个数据库实例中的用户信息,而system.namespaces集合保存着所有数据库集合的信息

3)用户自定义创建的集合,命名中不建议出现保留字符或者特殊字符,比如$,部分驱动的确支持集合中包含特殊字符,但是部分驱动并不支持

数据库实例

在MongoDB中,多个文档组合一个集合,而多个集合可以组成数据库实例,每个实例可以承载0-多个集合,并且每个实例拥有独立的权限,因此存储在磁盘上的时候,每个数据库实例也是独立存放在不同的文件中的。数据库在创建的时候也有命名的问题,一般来说只要是UTF-8编码的字符串即可,建议注意以下几点:

1)命名不能为“”或者是\0这种代表数据库命名结束或者空字符串

2)命名中不能有/、\、.、、<、>、:、|、?、$、等,建议只出现ASCII中的字母和数字*

3)在MongoDB中数据库实例是区分大小写的,如命名为ABC的数据库实例和abc的实例并不会识别为同一个,为了规范建议统一使用小写命名

4)数据库实例的命名最大不能超过64字节

除了我们自定义的数据库实例以外,在MongoDB中有一些数据库是默认保留的,这部分数据库实例都是具有特殊语义的系统数据库,常见如:

admin:从身份认证授权的角度来说,admin数据库实例属于root级别的数据库,如果把一个用户授权到admin中,那么这个用户将获取所有数据库的权限,另外我们在admin数据库中也可以执行一些比较危险的操作,比如关闭服务器

local:local数据库实例如同名字一样,每个服务器上都会有一个本地的,用来存储服务器本地所有的集合信息,最重要的是此数据库无法被复制到其他服务器实例

config:config数据库实例存储了mongoDB中分片的信息,在集群环境下,可以在config数据库实例中看到集群分片设置的信息

安装及启动MongoDB

了解了Mongo的基础概念,我们开始正式安装MongoDB,首先进入MongoDB的官方网站:

https://www.mongodb.com/try

找到Software,选择社区版的mongoDB Server下载


1595080420047.png

可以看到下载页面可以选择不同的操作系统以及包类型进行下载,


1595080601391.png

相比较其他的很多中间件的下载页友好很多,另外需要说明一下,MongoDB的版本管理比较简单,一般来说偶数号的版本,都是当前版本的稳定版,奇数号版本则是代表当前版本是开发迭代的版本,当然MongoDB的版本有三层,例如当前下载页默认的版本:4.2.8版本,第一位4代表是大版本4.X,而第二个版本才是我们刚刚说的是否正式的版本--这里的版本为8,代表当前的服务属于稳定版。

Window环境安装MongoDB

window版本的MongoDB安装就简单很多了,我们直接选择默认下载的版本,msi格式的安装包,点击Download进行下载,等待数秒后双击mongodb-win32-x86_64-2012plus-4.2.8-signed.msi,开始安装

1595081342458.png

点击Next,如果需要自定义安装地址,请选择Custom,不需要的可以直接选择Complete,默认安装在C盘路径中


1595081396608.png

到这一步,我们可以选择是否安装MongoDB服务,默认是勾选安装服务,建议保持勾选,不需要自启的可以考虑设置服务自启为手动启动


1595081429705.png

接着就到了是否安装MongoDB Compass的选项,MongoDB Compass是一个可视化的MongoDB数据管理工具,这里我们取消勾选,不需要使用该工具,后续我们可以使用Navicat For MongoDB等可视化工具操作管理
1595081613429.png

继续操作直到安装完成的界面,点击Finsh完成安装,接着我们可以进入MongoDB的安装目录下,找到mongo.exe程序,双击即可启动,启动后,我们来初始化设置管理员账号:

use admin;  //切换数据库到admin

创建用户,及相关的角色

db.createUser({ user: "root", pwd: "123456", roles: [{ role: "root", db: "admin" }] });

创建完毕后,退出mongo shell:

exit;

接着我们可以找到配置文件mongod.cfg 并开始修改,找到security 字段,去掉前面的#,并且在下一行设置authorization: enabled ,代表着我们要启动MongoDB的认证机制


1595081924892.png

此时,我们重启mongo以后,随便查询操作数据库的时候,会提示我们没有进行授权认证操作,我们进行认证授权操作:

db.auth("root", "123456");

即可完成认证,当然我们也可以在启动mongdb的时候,在启动命令上添加账号密码信息的方式进行启动,例如:

mongo -u "root" -p "123456" --authenticationDatabase admin

注:需要注意一点,安装以后,在没有指定启动文件等存放的目录的情况下,MongoDB会默认找安装目录所在盘的根目录中的/data/db,如果是C盘那么在C盘的根目录中必须有/data/db目录,不然启动的时候会出现启动失败的情况

Linux环境安装MongoDB

Linux环境下,安装方式有很多,比如Docker直接镜像安装,本次在Centos7系统中使用传统的YUM安装和解压安装两种方式进行安装

YUM方式安装

如果是YUM安装的方式,需要注意,直接使用YUM下载的版本比较旧,按照官方安装的指导,我们可以看到,需要先创建YUM源(官方安装启动文档地址:https://mongodb.net.cn/manual/tutorial/install-mongodb-on-red-hat/ )

1.首先我们使用vim创建一个/etc/yum.repos.d/mongodb-org-4.2.repo源文件:

vim /etc/yum.repos.d/mongodb-org-4.2.repo
[mongodb-org-4.2]
name=MongoDB Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/4.2/x86_64/
gpgcheck=1
enabled=1
gpgkey=https://www.mongodb.org/static/pgp/server-4.2.asc

esc后,:wq退出编辑,可以看到文件已经创建编辑完毕


1595084086678.png

接着我们开始下载安装稳定版的mongoDB,此时只需要使用yum命令即可:

sudo yum install -y mongodb-org
1595084191836.png

等待安装完成即可,需要注意的是,默认情况下,MongoDB使用mongod用户帐户运行,并使用以下默认目录:

/var/lib/mongo (数据目录)
/var/log/mongodb (日志目录)
/etc/mongod.conf (配置文件)

安装完成后,可以启动mongoDB,启动和停止服务可以直接使用Centos7的systemctl管理:

systemctl start mongod.service  (启动mongo服务)
systemctl stop mongod.service   (关闭mongo服务)

如果是需要设置开启远程连接mongo,我们需要vim /etc/mongod.conf文件,找到bindIp,将其注释掉,重启mongoDB服务即可,需要注意的是,不要忘记关闭防火墙或者开放默认的27017端口的防火墙

解压方式安装

如果是压缩包的方式解压下载的话,我们需要注意,Centos7有多个不同版本的选择,我们需要先知道当前版本:

cat /etc/redhat-release

可以看到我们当前的版本:


1595085589616.png

因此我们选择7.0对应的版本的压缩包进行下载:


1595085700175.png

这里我们选择直接copy link,在linux上使用wget直接下载

wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.2.8.tgz

等待下载完毕后,我们将其解压

tar -zxvf mongodb-linux-*-4.2.8.tgz

需要注意的是手动安装的话,我们需要保证mongoDB配置在环境变量中,此时可以选择将mongoDB的二进制文件(默认二进制文件位于/bin目录中)复制到PATH变量已经引用的目录中,例如:

sudo cp /path/to/the/mongodb-directory/bin/* /usr/local/bin/

接着指定PATH变量中列出的目录创建 二进制文件的符号链接,即可,例如:

sudo ln -s  /path/to/the/mongodb-directory/bin/* /usr/local/bin/

当然,除此之外,我们也可以选择,将我们的文件目录配置在环境变量中:

vim /etc/profile

在文件末尾添加:

export MONGODB_HOME=/usr/local/mongodb  
export PATH=$PATH:$MONGODB_HOME/bin

修改完毕,我们推出环境变量文件,刷新环境变量文件

source /etc/profile

即可完成配置

修改常见配置

经过前面的步骤,我们基本已经完成了配置,但是在使用过程中,一般我们还会配置指定一些常见文件的目录,例如数据所在的目录,以及日志的目录,接下来我们来配置一下数据库文件/日志文件等的目录:

//进入mongo目录
cd /usr/local/mongodb
//创建数据库目录 并且设置权限
mkdir -p data/db
chmod -r 777 data/db
//创建日志所在的目录和日志文件
mkdir logs
cd logs
touch mongodb.log
//创建并编辑启动文件
cd ../
vim mongodb.conf

在mongodb.conf配置文件中添加如下配置:

dbpath=/usr/local/mongodb/data/db  #数据文件存放目录
logpath=/usr/local/mongodb/logs/mongodb.log #日志存放目录
port=27017 #端口
fork=true #以守护程序的方式启用,即在后台运行
httpinterface=true #开启web控制台
logappend=true
maxConns=5000
storageEngine = mmapv1

这里我们可以看到配置文件中除了常见的配置以外,多了一个参数:

httpinterface,原来mongoDB还可以在启动的时候启动一个HTTP服务器,用来监控比启动端口高1000的端口,默认情况下是28017端口,而开启这个端口则需要启用httpinterface参数,启动以后则意味着我们可以通过浏览器访问http://192.168.1.130:28017,可以获取数据库的管理信息,而配置完成后,我们需要启动MongoDB服务的时候,只需要进入其二进制bin目录下:

cd /usr/local/mongodb/bin

使用mongod进行启动,不过需要注意的是,我们需要指定刚刚的配置文件进行启动

./mongod --config mongodb.conf

至此,MongoDB安装启动完成

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 160,165评论 4 364
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 67,720评论 1 298
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 109,849评论 0 244
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 44,245评论 0 213
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 52,596评论 3 288
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 40,747评论 1 222
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 31,977评论 2 315
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 30,708评论 0 204
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 34,448评论 1 246
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 30,657评论 2 249
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 32,141评论 1 261
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 28,493评论 3 258
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 33,153评论 3 238
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 26,108评论 0 8
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 26,890评论 0 198
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 35,799评论 2 277
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 35,685评论 2 272