MongoDB基础
什么是MongoDB
MongoDB 是由C++语言编写的,是一个基于分布式文件存储的开源数据库系统。
- 在高负载的情况下,添加更多的节点,可以保证服务器性能。
- MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。
存储结构
MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。
主要特点
- 非关系型数据库,基于
Document data model
(文档数据模型) - MongoDB以
BSON
(BinaryJSON) 格式存储数据,类似于 JSON 数据形式 - 关系型数据库使用
table
(tables of rows)形式存储数据,而MongoDB使用collections
(collections of documents) - 支持 临时查询(
ad hoc queries
): 系统不用提前定义可以接收的查询类型 - 索引通过
B-tree
数据结构, 3.2版本的WiredTiger 支持log-structured merge-trees(LSM)
- 支持索引和次级索引(
secondary indexes
): 次级索引是指文档或row有一个 主键(primary key
)作为索引,同时允许文档或row内部还拥有一个索引,提升查询的效率,这也是MongoDB比较大的一个特点
MongoDB安装
下载MongoDB
查找MongoDB安装包
到MongoDB地址下载 Download MongoDB Community Server | MongoDB linux安装包,并选择对应的版本,点击
copy link
得到地址就可以通过linux环境wget
进行下载了
下载MongoDB
通过
wget
命令下载刚才在页面copy的链接进行下载
安装wget
yum -y install wget
wget https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-rhel70-4.4.5.tgz
解压安装包
tar -zxvf mongodb-linux-x86_64-rhel70-4.4.5.tgz
重命名文件夹
mv mongodb-linux-x86_64-rhel70-4.4.5 mongodb4.4.5
配置环境变量
这里根据自己对应的mongodb路径配置,将我们的MongoDB的bin目录配置到系统环境中
vi /etc/profile
在 export PATH USER LOGNAME MAIL HOSTNAME HISTSIZE HISTCONTROL 一行的上面添加如下内容:
#设置 Mongodb环境变量
export PATH=/opt/mongodb/mongodb4.4.5/bin:$PATH
保存后通过下面的命令使环境变量生效
source /etc/profile
安装MongoDB
准备工作
Linux下我们使用tgz格式的安装包进行安装,没有像windows那样可以使用msi进行简易安装,所以,它这个包是不全的,我们需要进入mongodb目录再手动创建两个目录,data和log,data目录是用于存放数据的,log目录是用于存放日志文件的
mkdir data logs
#创建mongodb的日志文件
touch logs/mongodb.log
创建配置文件
因为该安装包不包含配置文件,我们需要去bin目录下面写一个mongodb的配置文件
vi mongodb.conf
这里面的数据文件以及日志路径就是我们刚才创建的目录的路径
#端口号 默认为27017
port=27017
#数据库数据存放目录
dbpath=/opt/mongodb/mongodb4.4.5/data
#数据库日志存放目录
logpath=/opt/mongodb/mongodb4.4.5/logs/mongodb.log
# pid存储路径
pidfilepath = /var/run/mongo.pid
#以追加的方式记录日志
logappend = true
#以后台方式运行进程
fork=true
#开启用户认证
#auth=true
#最大同时连接数
maxConns=100
#这样就可外部访问了,例如从win10中去连虚拟机中的MongoDB
bind_ip = 0.0.0.0
#每次写入会记录一条操作日志(通过journal可以重新构造出写入的数据)。
#启用日志文件,默认启用
journal=true
#这个选项可以过滤掉一些无用的日志信息,若需要调试使用请设置为false
quiet=true
使用系统服务启动
创建启动脚本
在/etc/init.d/路径下创建mongod的启动脚本
vi /etc/init.d/mongod
注意将MONGODB_HOME路径改为mongodb的安装路径
#!/bin/sh
# chkconfig:
#MogoDB home directory
MONGODB_HOME=/opt/mongodb/mongodb4.4.5/
#mongodb command
MONGODB_BIN=$MONGODB_HOME/bin/mongod
#mongodb config file
MONGODB_CONF=$MONGODB_HOME/bin/mongodb.conf
#mongodb PID
MONGODB_PID=/var/run/mongo.pid
#set open file limit
SYSTEM_MAXFD=65535
MONGODB_NAME="mongodb"
. /etc/rc.d/init.d/functions
if [ ! -f $MONGODB_BIN ]
then
echo "$MONGODB_NAME startup: $MONGODB_BIN not exists! "
exit
fi
start(){
ulimit -HSn $SYSTEM_MAXFD
$MONGODB_BIN --config="$MONGODB_CONF" --fork ##added
ret=$?
if [ $ret -eq 0 ]; then
action $"Starting $MONGODB_NAME: " /bin/true
else
action $"Starting $MONGODB_NAME: " /bin/false
fi
}
stop(){
PID=$(ps aux |grep "$MONGODB_NAME" |grep "$MONGODB_CONF" |grep -v grep |wc -l)
if [[ $PID -eq 0 ]];then
action $"Stopping $MONGODB_NAME: " /bin/false
exit
fi
kill -HUP `cat $MONGODB_PID`
ret=$?
if [ $ret -eq 0 ]; then
action $"Stopping $MONGODB_NAME: " /bin/true
rm -f $MONGODB_PID
else
action $"Stopping $MONGODB_NAME: " /bin/false
fi
}
restart() {
stop
sleep 2
start
}
case "$1" in
start)
start
;;
stop)
stop
;;
status)
status $prog
;;
restart)
restart
;;
*)
echo $"Usage: $0 {start|stop|status|restart}"
esac
设置权限
设置该脚本拥有执行权限
chmod 755 /etc/init.d/mongod
启动MongoDB
使用如下命令启动MongoDB
# 启动mongodb
service mongod start
# 检查服务是否存在
ps -ef|grep mongo
出现如下就提示表示mongodb已经启动成功
访问测试
输入
mongo
命令使用本地客户端进行访问
查询所有的数据库
关闭防火墙
如果需要mongoDB进行外部访问需要开放防火墙端口,因为我们使用了虚拟机所以直接关闭防火墙
检查防火墙状态
使用下面的命令可以检查防火墙状态
systemctl status firewalld.service
然后在下方可以查看得到“active(running)”,此时说明防火墙已经打开了
停止防火墙
在命令行中输入systemctl stop firewalld.service命令,进行关闭防火墙
systemctl stop firewalld.service
然后再使用命令systemctl status firewalld.service,在下方出现disavtive(dead),这样就说明防火墙已经关闭。
永久关闭防火墙
再在命令行中输入命令“systemctl disable firewalld.service”命令,即可永久关闭防火墙
systemctl disable firewalld.service
这样下次启动,防火墙就不会开启了
优雅关机
在生产环境,不要用 kill -9 关掉 mongodb 的进程,很可能造成 mongodb 的数据丢失;可以使用以下方式进行优雅关机
use admin
db.shutdownServer()
基本概念
和传统数据库对比
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下面我们分别介绍,下表将帮助您更容易理解Mongo中的一些概念:
对比项 | mongo | 数据库 |
---|---|---|
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
table joins | 表连接,MongoDB不支持 | |
primary key | primary key | 主键,MongoDB自动将_id字段设置为主键 |
通过下图实例,我们也可以更直观的了解Mongo中的一些概念:
下面我们对里面的每一个概念进行详细解释
数据库
一个mongoDB的实例可以运行多个database,database之间是完全独立的,每个database有自己的权限,每个database存储于磁盘的不同文件。
命令规范
databases的name可以是任意的UTF-8字符串。但是有以下限制
- 空字符串””是非法的
- 不允许出现’’,.,$,/,\,\0字符
- 建议名称都是小写
- 不能超过64个字节
特殊数据库
有一些数据库名是保留的,可以直接访问这些有特殊作用的数据库。
- admin:它是root级别的数据库,如果一个用户创建了admin数据库,该用户将自动集成所有数据库的权限,它可以执行一些服务器级别的命令,如列出所有数据库、关闭服务等。
- local:该数据库将永远不能被复制,只能在单台服务器本地使用。
- config:存储分布式部署时shard的配置信息
数据库操作
查看数据库列表
show dbs
命令可以显示所有数据的列表
显示当前数据库
执行 “db” 命令可以显示当前数据库对象或集合。
创建数据库
MongoDB 使用 use 命令创建数据库,如果数据库不存在,MongoDB 会在第一次使用该数据库时创建数据库。如果数据库已经存在则连接数据库,然后可以在该数据库进行各种操作。
show dbs;
#创建tmpdb数据库
use tmpdb;
show dbs;
注意: 在 MongoDB 中,只有在数据库中插入集合后才会创建! 就是说,创建数据库后要再插入一个集合,数据库才会真正创建。
use tmpdb;
# 在xxx的集合中插入一条数据
db.xxx.insertOne({"name":"张三"});
show dbs;
现在
tmpdb
数据库就显示出来了
删除数据库
可以使用
db.dropDatabase()
删除数据库
show dbs;
use tmpdb;
db;
#删除数据库
db.dropDatabase();
show dbs;
集合
相当于关系数据库的表,不过没有数据结构的定义。它由多个document组成。
命令规范
因为是无结构定义的,所以你可以把任何document存入一个collection里。每个collection用一个名字标识,需要注意以下几点:
- 名字不允许是空字符串""
- 名字不能包含\0字符,因为它表示名字的结束
- 不能创建以system.开头的
集合操作
创建集合
可以通过
db.createCollection(name,option)
创建集合参数说明:
- name: 要创建的集合名称
- options: 可选参数, 指定有关内存大小及索引的选项
# 创建或选择tmpdb数据库
use tmpdb;
# 在db数据库创建一个blog的集合
db.createCollection("blog");
查看集合
如果要查看已有集合,可以使用 show collections 或 show tables 命令:
删除集合
MongoDB 中使用 drop() 方法来删除集合
db.collection.drop()
如果成功删除选定集合,则 drop() 方法返回 true,否则返回 false。
文档
mongoDB的基本单位,相当于关系数据库中的行,它是一组有序的key/value键值对,使用json格式,
如:{"foo" : 3, "greeting": "Hello, world!"}。
key的命令规范
key是个UTF-8字符串,以下几点是需要注意的地方:
- 不能包含\0字符(null字符),它用于标识key的结束
- .和$字符在mangodb中有特殊含义,如$被用于修饰符($inc表示更新修饰符),应该考虑保留,以免被驱动解析
- 以_开始的key也应该保留,比如_id是mangodb中的关键字
注意事项
- 在mangodb中key是不能重复的
- value 是弱类型,甚至可以嵌入一个document
- key/value键值对在mangodb中是有序的
- mangodb是类型和大小写敏感的,如{"foo" : 3}和{"foo" : "3"}是两个不同的document,{"foo" : 3}和{"Foo" : 3}