Mongodb介绍

mongodb官网:www.mongodb.com 

c++编写,基于分布式,属于NoSQL的一种

mongodb是在NoSQL中是最像关系型数据库的

mongodb是将数据存储为一个文档,数据结构由键值(key=>value)对组成。mongodb文档类似于json对象。字段值可以包含其他文档、数组及文档数组

关于json

JSON:JavaScript 对象表示法(JavaScript Object Notation)。

JSON 是存储和交换文本信息的语法。类似 XML。

JSON 比 XML 更小、更快,更易解析。

每一章中用到的实例

 

{
"employees": [
{ "firstName":"Bill" , "lastName":"Gates" },
{ "firstName":"George" , "lastName":"Bush" },
{ "firstName":"Thomas" , "lastName":"Carter" }
]
}

这个 employee 对象是包含 3 个员工记录(对象)的数组。

因为基于分布式,所以很容易扩展



mongodb能够记录非关系型数据库记录不了的键值,如用户订单信息,包含商品和订单号,这样的记录是非关系型数据库memcached、redis记录不了的

mongodb和关系型数据库语句/概念对比

SQL术语/概念Mongodb术语/概念解释说明
databasedatabase数据库
tablecollection数据库表/集合
rowdocument记录数据行/文档
columnfield数据字段/域
indexindex索引
table joins
表连接,Mongodb不支持
primary key primary key  主键,Mongodb自动将_id字段设置为主键


Mongodb数据结构

spacer.gif图片.png



mongodb安装

从官网找yum安装源的文件配置内容

https://docs.mongodb.com/manual/tutorial/

复制yum文件的内容存到yum.repos.d目录下。配置文件名字自定义,但结尾后缀必须以repo结尾。如

 

[root@nfs1 ~]# vim /etc/yum.repos.d/mongodb.repo

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

保存这个yum源配置文件后执行yum install的命令来安装Mongodb

首先查看Mongodb的yum安装包,这里安装Mongodb-org的mongodb最新版本

 

[root@nfs1 ~]# yum list |grep mongodb
Trying other mirror.
collectd-write_mongodb.x86_64           5.8.1-1.el7                    epel
mongodb.x86_64                          2.6.12-6.el7                   epel
mongodb-org.x86_64                      4.0.4-1.el7                    mongodb-org-4.0
mongodb-org-mongos.x86_64               4.0.4-1.el7                    mongodb-org-4.0
mongodb-org-server.x86_64               4.0.4-1.el7                    mongodb-org-4.0
mongodb-org-shell.x86_64                4.0.4-1.el7                    mongodb-org-4.0
mongodb-org-tools.x86_64                4.0.4-1.el7                    mongodb-org-4.0
mongodb-server.x86_64                   2.6.12-6.el7                   epel
mongodb-test.x86_64                     2.6.12-6.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-3.el7                    epel
syslog-ng-mongodb.x86_64                3.5.6-3.el7                    epel
[root@nfs1 ~]# yum install -y  mongodb-org
Loaded plugins: fastestmirror
Loading mirror speeds from cached hostfileInstalled:
  mongodb-org.x86_64 0:4.0.4-1.el7

Dependency Installed:
  mongodb-org-mongos.x86_64 0:4.0.4-1.el7     mongodb-org-server.x86_64 0:4.0.4-1.el7     mongodb-org-shell.x86_64 0:4.0.4-1.el7     mongodb-org-tools.x86_64 0:4.0.4-1.el7

Complete!
 * elrepo: mirrors.tuna.tsinghua.edu.cn
 * epel: mirrors.yun-idc.com
--------------安装过程略
Installed:
  mongodb-org.x86_64 0:4.0.4-1.el7

Dependency Installed:
  mongodb-org-mongos.x86_64 0:4.0.4-1.el7     mongodb-org-server.x86_64 0:4.0.4-1.el7     mongodb-org-shell.x86_64 0:4.0.4-1.el7     mongodb-org-tools.x86_64 0:4.0.4-1.el7

Complete!

至此,yum安装Mongodb完成



链接Mongodb

首先我们配置一下mongodb的配置文件,指定日志、数据存储和启动文件的路径,并修改监听地址,多个地址使用逗号分隔

 

[root@nfs1 ~]# vim /etc/mongod.conf
systemLog:
  destination: file
  logAppend: true
  path: /var/log/mongodb/mongod.log

storage:
  dbPath: /var/lib/mongo
  journal:
    enabled: true

processManagement:
  fork: true # fork and run in background
  pidFilePath: /var/run/mongodb/mongod.pid # location of pidfile
  timeZoneInfo: /usr/share/zoneinfo

net:
  port: 27017
  bindIp: 127.0.0.1,192.168.1.234

启动mongodb,并查看启动监听的端口

 

[root@nfs1 ~]# netstat -ntlp |grep mongo
tcp        0      0 192.168.1.234:27017     0.0.0.0:*               LISTEN      2187/mongod
tcp        0      0 127.0.0.1:27017         0.0.0.0:*               LISTEN      2187/mongod
[root@nfs1 ~]# ps -aux |grep mongo
mongod     2187  2.7  3.0 1070084 57192 ?       Sl   23:24   0:00 /usr/bin/mongod -f /etc/mongod.conf
root       2216  0.0  0.0 112704   960 pts/0    R+   23:25   0:00 grep --color=auto mongo

链接mongodb使用mongo命令,默认连接本机的mongodb

也可以指定连接远程的mongodb主机和端口进行连接

 

[root@nfs1 ~]# mongo --host 127.0.0.1 --port 27017
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017/

如果mongodb配置有密码,那么需要在连接时指定下用户名和密码,格式为:

 

mongo --host 127.0.0.1 --port 27017 -uusername -ppasswd

在针对mongodb连接时验证用户密码是针对某个库来的,这样的情况就需要在指定用户名密码的时候同时指定库名称来操作

执行命令格式为:

 

mongo  -uusername -ppasswd  --authenticationDatabase db



mongodb用户管理

创建管理用户首先需要登入mongodb并切换到admin库中进行操作

授权语句中的格式:

user指定用户。customData为说明字段,可以省略。pwd为密码。roles指定用户角色。db指定授权库的名称

 

> use admin                      切换到admin库中
switched to db admin
> db.createUser({ user:"admin",customData:{dascription:"superuser"},pwd:"admin123",roles:[{role:"root",db:"admin"}]})
Successfully added user: {
 "user" : "admin",
 "customData" : {
  "dascription" : "superuser"
 },
 "roles" : [
  {
   "role" : "root",
   "db" : "admin"
  }
 ]
}

列出所有用户、查看当前库下的所有用户,需要切换到那个库中才能进行操作

 

> db.sysconfig.users.find()
> show users
{
    "_id" : "test.admin",
    "user" : "admin",
    "db" : "test",
    "customData" : {
        "dascription" : "superuser"
    },
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}
{
    "_id" : "test.linux",
    "user" : "linux",
    "db" : "test",
    "customData" : {
        "dascription" : "superuser"
    },
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

删除一个授权用户,删除后在执行查看用户则为空了

 

> db.dropUser('admin')
true
> show users
{
    "_id" : "test.linux",
    "user" : "linux",
    "db" : "test",
    "customData" : {
        "dascription" : "superuser"
    },
    "roles" : [
        {
            "role" : "root",
            "db" : "admin"
        }
    ],
    "mechanisms" : [
        "SCRAM-SHA-1",
        "SCRAM-SHA-256"
    ]
}

在一个库中查询一个授权用户,查询授权用户必须先要切换到授权库当中,然后执行查询操作

 

> use admin
switched to db admin
> db.system.users.find()
{ "_id" : "test.linux", "user" : "linux", "db" : "test", "credentials" : { "SCRAM-SHA-1" : { "iterationCount" : 10000, "salt" : "9Oj9a9ZQHc7HDZKAfzTR+g==", "storedKey" : "i4F70HK7OUvA0L1Yw3uOjwMxMcw=", "serverKey" : "cLtXMoPnqmyAhVytgkBhmUeKfNE=" }, "SCRAM-SHA-256" : { "iterationCount" : 15000, "salt" : "CgtK7ceZTeJHAvXr4yA/cy1jbyklsr3ZuC5WOg==", "storedKey" : "lN1xymxwGQ6FA2AybYz0xvTXAXXN0LbERWv/PIv9cKI=", "serverKey" : "yaKBor03hu08x2GAtS+f/Jz0iJ/VD8T5rL7HTIm9dIY=" } }, "customData" : { "dascription" : "superuser" }, "roles" : [ { "role" : "root", "db" : "admin" } ] }

生效用户,授权用户后是不生效的,需要配置一下启动脚本,找到OPTIONS的那行,增加一个启动选项:--auth

 

[root@nfs1 ~]# vim /usr/lib/systemd/system/mongod.service

[Unit]
Description=MongoDB Database Server
After=network.target
Documentation=https://docs.mongodb.org/manual

[Service]
User=mongod
Group=mongod
Environment="OPTIONS=--auth -f /etc/mongod.conf"

重新启动mongodb服务,让配置文件加载生效

 

[root@nfs1 ~]# systemctl restart mongod
Warning: mongod.service changed on disk. Run 'systemctl daemon-reload' to reload units.
[root@nfs1 ~]# systemctl daemon-reload
[root@nfs1 ~]# systemctl restart mongod

在正常登录下(没有用户授权的情况下),mongodb是不能允许进行命令操作的。

会出现如下提示:Error: command usersInfo requires authentication

 

[root@nfs1 ~]# mongo --host 127.0.0.1 --port 27017
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" : UUID("beff9fe6-6c04-4391-94fd-79478f1393a7") }
MongoDB server version: 4.0.4
> use admin
switched to db admin
> show users;
2018-11-17T01:48:58.860+0800 E QUERY [js] Error: command usersInfo requires authentication :
_getErrorWithCode@src/mongo/shell/utils.js:25:13
DB.prototype.getUsers@src/mongo/shell/db.js:1763:1
shellHelper.show@src/mongo/shell/utils.js:859:9
shellHelper@src/mongo/shell/utils.js:766:15
@(shellhelp2):1:1

在没有授权的情况下不能执行某些操作,那么我们指定下授权用户和密码来登入操作

在指定了授权用户和指定库后能够登录到mongodb进行查看授权用户信息

登入格式:mongo --host 127.0.0.1 --port 27017 -u linux -p 'admin123' --authenticationDatabase "admin"

登入时必须针对这个库来操作

 

[root@nfs1 ~]# mongo --host 127.0.0.1 --port 27017 -u linux -p 'admin123' --authenticationDatabase "admin"
MongoDB shell version v4.0.4
connecting to: mongodb://127.0.0.1:27017/
Implicit session: session { "id" : UUID("7c8c31e0-e685-433d-b61a-3c3c514ee6a9") }
MongoDB server version: 4.0.4
Server has startup warnings:
2018-11-17T01:43:59.402+0800 I CONTROL [initandlisten]
2018-11-17T01:43:59.402+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/enabled is 'always'.
2018-11-17T01:43:59.402+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-11-17T01:43:59.403+0800 I CONTROL [initandlisten]
2018-11-17T01:43:59.403+0800 I CONTROL [initandlisten] ** WARNING: /sys/kernel/mm/transparent_hugepage/defrag is 'always'.
2018-11-17T01:43:59.403+0800 I CONTROL [initandlisten] ** We suggest setting it to 'never'
2018-11-17T01:43:59.403+0800 I CONTROL [initandlisten]
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).

The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.

To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---

> use admin
switched to db admin
> show users
{
 "_id" : "admin.linux",
 "user" : "linux",
 "db" : "admin",
 "customData" : {
  "dascription" : "superuser"
 },
 "roles" : [
  {
   "role" : "root",
   "db" : "admin"
  }
 ],
 "mechanisms" : [
  "SCRAM-SHA-1",
  "SCRAM-SHA-256"
 ]
}

用户访问授权,让user1用户对db1库有读写权限,对db2库只读权限

授权命令如:

db.createUser({user:"user1",pwd:"123abc",roles:[{role:"readWrite",db:"db1"},{role:"read",db:"db2"}]}) 

 

> db.createUser({user:"user1",pwd:"123abc",roles:[{role:"readWrite",db:"db1"},{role:"read",db:"db2"}]})
Successfully added user: {
 "user" : "user1",
 "roles" : [
  {
   "role" : "readWrite",
   "db" : "db1"
  },
  {
   "role" : "read",
   "db" : "db2"
  }
 ]
}

验证过程:

user1对db1库有读写权限,对db2只有只读权限。

之所以先use db1,表示用户在db1库中创建,一定就需要db1库来验证身份,用户信息是跟随数据库的。比如上述user1用户虽然有db2的访问权限,但是一定要在db1上进行身份验证,直接访问db2会提示验证失败

 

> use db1
switched to db db1
> db.auth('user1','123abc')
1

认证成功后就可以在db2下的数据库中创建数据了



mongodb的授权用户类别和权限类别

 

Read:允许用户读取指定数据库
readWrite:允许用户读写指定数据库
dbAdmin:允许用户在指定数据库中执行管理函数,如索引创建、删除,查看统计或访问system.profile.
userAdmin:允许用户向system.users集合写入,可以找指定数据库里创建、删除和管理用户
clusterAdmin:只在admin数据库中可用,赋予用户所有分片和复制集相关函数的管理权限。
readAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读权限
readWriteAnyDatabase:只在admin数据库中可用,赋予用户所有数据库的读写权限
userAdminAnyDatabase :只在admin数据库中可用,赋予用户所有数据库的userAdmin权限
dbAdminAnyDatabase;只在admin数据库中可用,赋予用户所有数据库的dbAdmin权限。
root:只在admin数据库中可用。超级账号,超级权限