mongodb入门教程
作为mongodb小白一枚,为了将来能够和大神们搭得上话,特此来稳固一下基础知识。
一、基础介绍
这里多mongodb来个简单的自我独白:“大家好,我是你们最喜欢使用的分布式文件存储数据库---mongodb,我是有高端语言C++编写实现的。旨在为WEB应用提供可扩展的高性能数据存储解决方案。MongoDB[2] 是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引”。这些基本概念大家估计是最不想看的。但是要成为大神,你一定要知道你使用的工具的优缺点,问什么要使用这个工具,使用它能够我们带来什么好处。下面简单介绍一下mongodb的优缺点:
优点:
- 面向文档存储(类JSON数据模式简单而强大)
- 动态查询
- 全索引支持,扩展到内部对象和内嵌数组
- 查询记录分析
- 快速,就地更新
- 高效存储二进制大对象 (比如照片和视频)
- 复制和故障切换支持
- Auto- Sharding自动分片支持云级扩展性
- MapReduce 支持复杂聚合
- 支持多语言版本
缺点:
- 不支持事务(进行开发时需要注意,哪些功能需要使用数据库提供的事务支持)
- MongoDB占用空间过大 (不过这个确定对于目前快速下跌的硬盘价格来说,也不算什么缺点了)
- MongoDB没有如MySQL那样成熟的维护工具,这对于开发和IT运营都是个值得注意的地方
- 在32位系统上,不支持大于2.5G的数据(很多操作系统都已经抛弃了32位版本,所以这个也算不上什么缺点了,3.4版本已经放弃支持32 位 x86平台)
mongodb和mysql对比
对比 | mongodb | mysql |
---|---|---|
数据库模型 | 非关系型 | 关系型 |
存储方式 | 虚拟内存+持久化 | 不同引擎有不同存储方式 |
查询语句 | 独特的mongodb查询方式 | 传统的SQL语句 |
架构特点 | 可以通过副本集、以及分片来实现高可用 | 常见的有单点,M-S,MHA,MMM,Cluster等机构方式 |
数据处理方式 | 基于内存,将热数据存在物理内存中,从而达到高速读写 | 不同引擎有不同特点 |
成熟度 | 新型数据库,成熟度低(正在大规模普及使用) | 具有较为成熟的体系,成熟度较高 |
广泛度 | NoSQL数据库中,mongodb是较为完善的DB之一,使用人群不断增加 | 开源数据库份额在不断增加,mysql份额也在持续增长中 |
二、mongodb数据库安装
1. 安装前配置准备
MongoDB是一个文档数据库。一个MongoDB可以有我个Instance实例,每个实例都可以有多个DataBase,每个DataBase又可以有多个Collection;每个Collection一般有很多Document。如果要和MySQL作类比的话,Document相当于行,Collection相当于表,DataBase相当于库。
MongoDB的安装和启动均在普通用户下进行。MongoDB的部署有单机和集群情况,其中集群部署又分为主从、副本集、分片。主从和副本集都是做主从备份的,区别在与主从集群在主节点宕机后从节点需要手动切换成主节点,而副本集则可以自动切换,实现容灾功能,目前主从集群官方已不推荐使用;分片集群是在服务器资源不够用的情况下进行水平扩容。
本次安装主要以操作系统为Red Hat Enterprise Linux Server release 6.4 (Santiago),linux内核版本是2.6.32-358.el6.x86_64。介绍MongoDB的单机部署和分片集群部署。下面安装部署统一使用普通用户安装。
2. 软件安装
2.1 单机安装
2.1.1 说明
安装配置清单
主机名 | node69 |
主机绑定机器IP | 192.168.230.128 |
部署包 | mongodb-linux-x86_64-3.0.8.tgz |
安装目录 | /home/apple/mongodb-alone |
配置文件 | /home/apple/mongodb-alone/conf/mongodb.conf |
日志位置 | /home/apple/mongodb-alone/logs/mongodb.log |
使用端口 | 27017 |
2.1.2 部署
1、下载介质,上传到服务器上,本文使用/home/apple目录下,进入目录
输入命令tar -zxvf mongodb-linux-x86_64-3.0.8.tgz
,解压mongodb部署包,解压完成后获得mongodb-linux-x86_64-3.08目录
2、输入命令mv mongodb-linux-x86_64-3.0.8 mongodb-alone
,将安装文件夹名字改为mongodb-alone
3、输入命令cd mongodb-alone
,进入安装目录,内容如下
4、创建数据存储目录和日志存储目录以及日志存储文件
输入命令:mkdir -p data
(创建数据存储目录)
输入命令:mkdir logs
输入命令:touch logs/mongodb.log
(创建日志存储文件)
5、创建配置文件
输入命令:mkdir conf
(创建配置文件夹)
输入命令:touch conf/mongodb.conf
(创建配置文件)
输入命令vi conf/mongodb.conf
,编辑mongodb.conf文件
添加如下表格中的内容(下面有解释),并保存
|
解释:
port:mongodb端口号,默认是27017
dbpath:mongodb数据存储路径,就是之前创建的data/mongodb目录
storageEngine:存储引擎类型
wiredTigerCacheSizeGB:工作集大小(使用内存大小),根据需要设置(我这里用来测试的只用了1G),单位GB
wiredTigerJournalCompressor:文件压缩方式(有3种:none|snappy|zlib不压缩|有效利用资源的压缩(默认启用)|出色的压缩,但需要占用更多资源)
logpath:日志存储路径,是一个文件的路径,这里是之前的logs/mongodb.log文件
logappend:日志以在文件末尾追加的方式存储
fork:后台运行
2.1.3 启动mongodb
1、输入命令
bin/mongod -f /home/apple/mongodb-alone/conf/mongodb.conf
启动mongodb服务,如果出现started successfully说明启动成功
2、输入命令ps -ef | grep mongo
,可以看到刚刚启动的mongodb
进程。或,输入netstat -lanp | grep 27017
查看27017端口
3、输入命令bin/mongo 127.0.0.1:27017
可以进入mongodb,如果没有报错标示成功
4、查看mongodb数据库输入命令:show dbs
2.1.4 关闭mongodb
1、使用命令:ps -ef |grep mongo
查看进程号
2、输入命令:kill -2 10917
关闭mongodb数据库,(千万不是使用kill -9 pid
)
2.2 集群部署
这里后面继续补充。。。。。。。。。。
三、mongodb基本操作
1. mongodb创建数据库、表以及用户操作
1、输入命令:db.getMongo()
查看当前db的链接机器地址
2、输入命令: show dbs mongodb
中所有数据库
3、输入命令:use test
创建test数据库或切换test数据库(MongoDB use DATABASE_NAME 用于创建数据库。该命令将创建一个新的数据库,如果它不存在,否则将返回现有的数据库。)
4、 输入命令:show collections
查看数据库test中所有表Collection结构(由于当前test数据库没有表Collection,所以没有任何显示)
5、Collection聚集集合
a、创建一个聚集集合(table),输入命令: db.createCollection("collName", {size: 20, capped: 5, max: 100})
b、得到指定名称的聚集集合(table),输入命令:db.getCollection("collName")
c、 得到当前db的所有聚集集合,输入命令:db.getCollectionNames()
d、向collection中插入一条数据,输入命令:db.collName.insert({name:"jack",age:33})
d、得到指定聚集集合(table)数据,输入命令: db.collName.find()
可以查到刚刚插入的数据
e、其他命令,大家都可以试试
查看聚集集合基本信息
1、查看帮助 db.collName.help();
2、查询当前集合的数据条数 db.collName.count();
3、查看数据空间大小 db.collName.dataSize();
4、得到当前聚集集合所在的db db.collName.getDB();
5、得到当前聚集的状态 db.collName.stats();
6、得到聚集集合总大小 db.collName.totalSize();
7、聚集集合储存空间大小 db.collName.storageSize();
8、Shard版本信息 db.collName.getShardVersion()
9、聚集集合重命名 db.collName.renameCollection("collNameTwo");
将collName
重命名为collNameTwo
10、删除当前聚集集合 db.collName.drop();
2. mongodb用户权限操作
1、切换至admin数据库,输入命令:use admin
2、创建一个用户管理用户admin用户,赋予管理权限
db.createUser(
{
user: "admin",
pwd: "admin",
roles: [
{ role: "userAdminAnyDatabase", db: "admin" }
]
}
)
3、切换需要使用的普通db下面,例如输入命令:use mslog
4、为mslog创建一个可读写用户,用户名:xiaoxiao 密码:xiaoxiao
db.createUser(
{
user: "xiaoxiao",
pwd: "xiaoxiao",
roles: [
{ role: "readWrite", db: "mslog" }
]
}
)
5、关闭mongodb,重启mongodb数据库验证用户权限是否生效,使用命令:quit() 推出mongodb命令行,
6、输入命令:ps -ef |grep mongo
查看进程号,再使用kill -2 pid
关闭mongodb数据库
7、再到mongodb-alone/conf/mongodb.conf
mongodb的配置文件中添加权限启动项目 auth=true 添加到配置最后
port=27017
dbpath=/home/apple/mongodb-alone/data
storageEngine=wiredTiger
wiredTigerCacheSizeGB=1
wiredTigerJournalCompressor=zlib
logpath=/home/apple/mongodb-alone/logs/mongodb.log
logappend=true
fork=true
auth=true
8、使用带权限启动mongodb,输入命令:bin/mongod -auth -f /home/apple/mongodb-alone/conf/mongodb.conf
9、 进入mongodb命令行,不用用户登录直接查看admin下面collection
10、使用admin用户登录查看当前用户,再使用小明不同用户查看数据库mslog
> use mslog
switched to db mslog
> db.auth("xiaoxiao","xiaoxiao")
1
> show collections
>
>
> use admin
switched to db admin
> show collections
system.users
system.version
> db.system.users.find()
{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "R1OA10qFZwU983mLGLNvsw==", "storedKey" : "0Nlv6bxjHdf0YSXNtw+NdfCQQHU=", "serverKey" : "wAtSgUg9XH5Hx7npbRg7ax7ukS4=" } }, "roles" : [ { "role" : "userAdminAnyDatabase", "db" : "admin" } ] }
{ "_id" : "mslog.xiaoxiao", "user" : "xiaoxiao", "db" : "mslog", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "4QShsMOkbzJrpemIpnj8oA==", "storedKey" : "LJpdLDx6qxg17Ua2vuMp9GuL+V4=", "serverKey" : "TfxYegmo22jmEU6oyAUttJaGmA4=" } }, "roles" : [ { "role" : "readWrite", "db" : "mslog" } ] }
>
>
> use test
switched to db test
> show collections
collName
> db.collName.find()
Error: error: { "$err" : "not authorized for query on test.collName", "code" : 13 }
>
>
>
>
> use mslog
switched to db mslog
>
>
>
> db.testtable.insert({name:"xiaoming",age:33})
WriteResult({ "nInserted" : 1 })
>
>
> show collections
testtable
> db.testtable.find()
{ "_id" : ObjectId("592434f56f93ff4b4c6d7d8e"), "name" : "xiaoming", "age" : 33 }
>
这里面有一个详细mongodb用户角色授权可以瞅瞅http://www.2cto.com/database/201507/420854.html