本文共 9594 字,大约阅读时间需要 31 分钟。
MongoDB是一个基于分布式文件存储的数据库,属于文档型的,虽然也是NoSQL数据库的一种,但是与redis、memcached等数据库有些区别。MongoDB由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
MongoDB是一个介于关系数据库和非关系数据库之间的产品,是非关系数据库当中功能最丰富,最像关系数据库的。他支持的数据结构非常松散,是类似json的bson格式,因此可以存储比较复杂的数据类型。Mongo最大的特点是他支持的查询语言非常强大,其语法有点类似于面向对象的查询语言,几乎可以实现类似关系数据库单表查询的绝大部分功能,而且还支持对数据建立索引。
2007年10月,MongoDB由10gen团队所发展。2009年2月首度推出。
MongoDB 可以将数据存储为一个文档,数据结构由键值(key=>value)对组成。MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档、数组及文档数组。
MongoDB官网地址,目前最新版是3.6:
关于JSON的描述可以参考以下文章:
特点:
不管我们学习什么数据库都应该学习其中的基础概念,在mongodb中基本的概念是文档、集合、数据库,下图是MongoDB和关系型数据库的术语以及概念的对比:
以下使用两张图对比一下关系型数据库和MongoDB数据库的数据存储结构:
关系型数据库数据结构:MongoDB数据结构:
首先上官方的安装文档:
mongodb可以通过yum安装,首先需要创建官方提供的yum源:
1.进入/etc/yum.repos.d/目录下:cd /etc/yum.repos.d/
2.编辑配置文件加入以下内容:
[root@localhost /etc/yum.repos.d]# vim mongodb-org-3.6.repo[mongodb-org-3.6]name=MongoDB Repositorybaseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.6/x86_64/gpgcheck=1enabled=1gpgkey=https://www.mongodb.org/static/pgp/server-3.6.asc
3.编辑完成之后查看是否有mongodb相关的rpm包:
[root@localhost /etc/yum.repos.d]# yum list |grep mongodbcollectd-write_mongodb.x86_64 5.8.0-1.el7 epel mongodb.x86_64 2.6.12-4.el7 epel mongodb-org.x86_64 3.6.1-1.el7 mongodb-org-3.6mongodb-org-mongos.x86_64 3.6.1-1.el7 mongodb-org-3.6mongodb-org-server.x86_64 3.6.1-1.el7 mongodb-org-3.6mongodb-org-shell.x86_64 3.6.1-1.el7 mongodb-org-3.6mongodb-org-tools.x86_64 3.6.1-1.el7 mongodb-org-3.6mongodb-server.x86_64 2.6.12-4.el7 epel mongodb-test.x86_64 2.6.12-4.el7 epel nodejs-mongodb.noarch 1.4.7-1.el7 epel php-mongodb.noarch 1.0.4-1.el7 epel php-pecl-mongodb.x86_64 1.1.10-1.el7 epel poco-mongodb.x86_64 1.6.1-2.el7 epel syslog-ng-mongodb.x86_64 3.5.6-3.el7 epel [root@localhost /etc/yum.repos.d]#
如上,可以看到yum源中已经有mongodb3.6的rpm包。
4.然后就是直接yum安装了:
yum install -y mongodb-org
5.在命令行上输入mongo,然后按两下tap键,出现以下命令代表安装成功:
[root@localhost ~]# mongomongo mongodump mongofiles mongoperf mongos mongotop mongod mongoexport mongoimport mongorestore mongostat [root@localhost ~]#
1.先看一下mongodb的配置文件:
[root@localhost ~]# vim /etc/mongod.conf# mongod.conf# for documentation of all options, see:# http://docs.mongodb.org/manual/reference/configuration-options/# where to write logging data.systemLog: # 这里是定义日志文件相关的 destination: file logAppend: true path: /var/log/mongodb/mongod.log# Where and how to store data.storage: # 数据存储目录相关 dbPath: /var/lib/mongo journal: enabled: true# engine:# mmapv1:# wiredTiger:# how the process runsprocessManagement: # pid文件相关 fork: true # fork and run in background pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile timeZoneInfo: /usr/share/zoneinfo# network interfacesnet: # 定义监听的端口以及绑定的IP,IP可以有多个使用逗号分隔即可 port: 27017 bindIp: bindIp: 127.0.0.1,192.168.77.130 # Listen to local interface only, comment to listen on all interfaces.#security:#operationProfiling:#replication:#sharding:## Enterprise-Only Options#auditLog:#snmp:
2.启动 mongod 服务:
[root@localhost ~]# systemctl start mongod[root@localhost ~]# ps aux |grep mongodmongod 9283 1.7 2.4 1003888 45700 ? Sl 19:32 0:00 /usr/bin/mongod -f /etc/mongod.confroot 9307 0.0 0.0 112668 972 pts/0 S+ 19:33 0:00 grep --color=auto mongod[root@localhost ~]# netstat -lntp |grep mongodtcp 0 0 192.168.77.130:27017 0.0.0.0:* LISTEN 9359/mongod tcp 0 0 127.0.0.1:27017 0.0.0.0:* LISTEN 9359/mongod [root@localhost ~]#
提示:如果mongodb监听端口并不是默认的27017,则在连接的时候需要加--port 选项,例如:
mongo --port 27018
3.在本机可以直接运行命令mongo进入到mongodb shell中:
[root@localhost ~]# mongoMongoDB shell version v3.6.1connecting to: mongodb://127.0.0.1:27017MongoDB server version: 3.6.1Welcome to the MongoDB shell.For interactive help, type "help".For more comprehensive documentation, see http://docs.mongodb.org/Questions? Try the support group http://groups.google.com/group/mongodb-userServer has startup warnings: 2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] 2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] ** WARNING: Access control is not enabled for the database.2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] ** Read and write access to data and configuration is unrestricted.2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] 2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] 2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] 2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'2018-01-05T19:40:00.498+0800 I CONTROL [initandlisten] 2018-01-05T19:42:05.011+0800 E - [main] Error loading history file: FileOpenFailed: Unable to fopen() file /root/.dbshell: No such file or directory>
可以看到,报了一个错误信息没有找到/root/.dbshell,这个没关系,等你里面输入了命令后就会自动生成,这个文件是用来记录命令历史的。其他的警告信息不用管,不影响使用。
连接远程的mongodb,需要加--host来指定目标IP,例如:
[root@localhost ~]# mongo --host 192.168.77.130 --port 27017
如果远程的mongodb设置了验证,则在连接的时候需要带用户名和密码:
mongo -uusername -ppasswd --authenticationDatabase db
1.进入到MongoDB里,切换到admin库,因为得到admin库里才能进行用户相关的操作:
> use adminswitched to db admin>
2.创建用户:
> db.createUser( { user: "admin", customData: {description: "superuser"}, pwd: "admin122", roles: [ { role: "root", db: "admin" } ] } )Successfully added user: { "user" : "admin", "customData" : { "description" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ]}>
以上我们创建了一个admin用户,user指定用户,customData为说明字段,可以省略,pwd为密码,roles指定用户的角色,role相当于指定权限,db指定库名,创建用户时必须针对一个库。
3.列出所有的用户:
> db.system.users.find(){ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "CXds+L1Twxyf9qlKGrxVpQ==", "storedKey" : "s3hGUltMdhQYAF8nR8eNnVxlE7Q=", "serverKey" : "SDwyYVdnUZew1suc+g9oZZx9Has=" } }, "customData" : { "description" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }>
4.查看当前库下所有的用户
> show users{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "customData" : { "description" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ]}>
5.删除用户:
# 先创建一个用户> db.createUser({user:"zero",pwd:"123aaa",roles:[{role:"read",db:"testdb"}]})Successfully added user: { "user" : "zero", "roles" : [ { "role" : "read", "db" : "testdb" } ]}# 删除用户> db.dropUser("zero")true # 返回true意为成功# 可以看到zero用户不存在了> show users{ "_id" : "admin.admin", "user" : "admin", "db" : "admin", "customData" : { "description" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ]}>
6.以上我们创建了一个admin用户,但是若要用户生效,还需要编辑启动脚本vim /usr/lib/systemd/system/mongod.service,在OPTIONS=后面增--auth:
[root@localhost ~]# vim /usr/lib/systemd/system/mongod.service# 将这句:Environment="OPTIONS=-f /etc/mongod.conf"#修改为:Environment="OPTIONS=--auth -f /etc/mongod.conf"
重启服务:
[root@localhost ~]# systemctl daemon-reload[root@localhost ~]# systemctl restart mongod[root@localhost ~]# !psps aux |grep mongodmongod 9966 3.4 2.3 1003884 43004 ? Sl 21:05 0:00 /usr/bin/mongod --auth -f /etc/mongod.confroot 9994 0.0 0.0 112668 976 pts/0 S+ 21:05 0:00 grep --color=auto mongod[root@localhost ~]#
7.使用admin用户登录MongoDB:
[root@localhost ~]# mongo -u "admin" -p "admin122" --authenticationDatabase "admin" --host 192.168.77.130 --port 27017
8.再来创建一个用户:
> use db1 # 当use一个不存在的库时会自动创建switched to db db1> db.createUser( { user: "test1", pwd: "123aaa", roles: [ { role: "readWrite", db: "db1" }, {role: "read", db: "db2" } ] } ) # 可以有不同的角色针对不同的库Successfully added user: { "user" : "test1", "roles" : [ { "role" : "readWrite", "db" : "db1" }, { "role" : "read", "db" : "db2" } ]}> show users # 因为在db1这个库里创建的用户,就只能在这个库里show出来{ "_id" : "db1.test1", "user" : "test1", "db" : "db1", "roles" : [ { "role" : "readWrite", "db" : "db1" }, { "role" : "read", "db" : "db2" } ]}>
以上创建的test1用户对db1库有读写权限,对db2库有只读权限。之所以先use db1,表示用户在 db1 库中创建,就一定要db1库验证身份,即用户的信息跟随数据库。比如上述 test1虽然有 db2 库的读取权限,但是一定要先在db1库进行身份验证,直接访问会提示验证失败。
在db1中验证身份:
> use db1switched to db db1> db.auth("test1", "123aaa")1# 验证完之后才可以在db2库中进行相关的操作> use db2switched to db db2> show users>
本文转自 ZeroOne01 51CTO博客,原文链接:http://blog.51cto.com/zero01/2057717,如需转载请自行联系原作者