MongoDB数据库(1)

一、MongoDB数据库基础

1.什么是MongoDB数据库

MongoDB 是由C ++语言编写的,是一个基于分布式文件存储的开源数据库系统。在高负载的情况下,添加更多的节点,可以保证服务器性能。MongoDB 旨在为WEB应用提供可扩展的高性能数据存储解决方案。

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

  • MongoDB与传统数据库之间的区别

① 传统型数据库: 结构化数据, 定好了表结构后,每一行的内容,必是符合表结构的,就是说--列的个数,类型都一样.

② mongo文档型数据库: 表下的每篇文档,都可以有自己独特的结构(json对象都可以有自己独特的属性和值)

MongoDB是文档类型的数据库。存储类型是文档(BSon)[即json的二进制化]

2.主要特点

  • MongoDB 是一个面向文档存储的数据库,操作起来比较简单和容易。

  • 你可以在MongoDB记录中设置任何属性的索引(如:FirstName="Sameer",Address="8 Gandhi Road")来实现更快的排序。

  • 你可以通过本地或者网络创建数据镜像,这使得MongoDB有更强的扩展性。

  • 如果负载的增加(需要更多的存储空间和更强的处理能力) ,它可以分布在计算机网络中的其他节点上这就是所谓的分片。

  • Mongo支持丰富的查询表达式。查询指令使用JSON形式的标记,可轻易查询文档中内嵌的对象及数组。

  • MongoDb 使用update()命令可以实现替换完成的文档(数据)或者一些指定的数据字段。

  • Mongodb中的Map/reduce主要是用来对数据进行批量处理和聚合操作。

  • GridFS是MongoDB中的一个内置功能,可以用于存放大量小文件。

  • MongoDB允许在服务端执行脚本,可以用Javascript编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务端,下次直接调用即可。

  • MongoDB支持各种编程语言:RUBY,PYTHON,JAVA,C++,PHP,C#等多种语言。

二、Linux环境下部署MongoDB

打开官网下载地址:分别对应4个平台,windows、Linux、OSX和Solaris

https://docs.mongodb.com/manual/tutorial/install-mongodb-on-red-hat/

1.官方仓库软件包介绍

包名字 描述
mongodb-org 一个元数据包,将自动安装下面列出的四个组件软件包
mongodb-org-server 包含mongod守护进程和相关的配置以及init脚本
mongodb-org-mongos 包含mongos守护进程
mongodb-org-shell 包含mongo shell 命令行解释器
mongodb-org-tools 其他工具

mongodb-org-server软件包提供了一个mongod以/etc/mongod.conf 配置文件为参照的初始化脚本。
默认的配置文件中默认 bind_ip 设置为127.0.0.1 这是个默认监听地址。

2.配置包管理系统

2.1mongodb3.6版本

创建一个/etc/yum.repos.d/mongodb-org-3.6.repo文件,以便您可以直接使用安装MongoDB yum。

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

2.2mongodb3.4版本

假如你想安装 3.4 版本,那么创建 3.4 的仓库文件

# cat /etc/yum.repos.d/mongodb-org-3.4.repo
[mongodb-org-3.4]
name=MongoDB 3.4 Repository
baseurl=https://repo.mongodb.org/yum/redhat/$releasever/mongodb-org/3.4/x86_64/
gpgcheck=0
enabled=1

3.安装MongoDB软件包。

sudo yum install -y mongodb-org
  • 要安装特定版本的MongoDB,请分别指定每个组件包并将版本号附加到包名称,如下例所示:
sudo yum install -y mongodb-org-3.6.3 mongodb-org-server-3.6.3 mongodb-org-shell-3.6.3 mongodb-org-mongos-3.6.3 mongodb-org-tools-3.6.3

4.设置防止意外升级项

您可以指定任何可用的MongoDB版本。但是yum ,当更新的版本可用时,将升级软件包。
为防止意外升级,将以下exclude指令添加到您的/etc/yum.conf文件中:

exclude = mongodb-org,mongodb-org-server,mongodb-org-shell,mongodb-org-mongos,mongodb-org-tools

5.启动/按关闭服务

# systemctl start mongod
# systemctl enable mongod
# ss -ntal
State      Recv-Q Send-Q Local Address:Port               Peer Address:Port
LISTEN     0      128          *:22                       *:*
LISTEN     0      1      127.0.0.1:32000                    *:*
LISTEN     0      128    127.0.0.1:27017                    *:*
# systemctl stop mongod

三、MongoDB数据库简单操作

1.MongoDB入门命令

mongo                       //进入当前数据库       
show  dbs                   //查看mongodb内数据库
use   databaseName          //选库
show  tables/collections    //查看当前数据库下的表格

1.1 创建数据库

Mongodb的库是隐式创建,通过use 一个不存在的库然后在该库下创建collection,即可创建库。

use shop                     //数据库默认直接使用
db.createCollection('user'); //创建关系表  
show collection;            //查看数据库内表

1.2添加表内数据

db.user.insert({name:'yy',age:18});         
db.user.insert({_id:2 , name:"uni" ,male:"mam"});    //添加内容指定id
db.user.insert({_id:3,name:'yuydddu',hobby:['swiming','runing'],intro:{'title':'my name is yutao'}});
//添加非内键值,可以不匹配

---------------------------------------
 db.user.find()      //查询命令      
{ "_id" : ObjectId("5c83b9e369b62226da1a2810"), "name" : "yy", "age" : 18 }
{ "_id" : 2, "name" : "uni", "male" : "mam" }
{ "_id" : 3, "name" : "yuydddu", "hobby" : [ "swiming", "runing" ], "intro" : { "title" : "my name is yutao" } }
> db.user.insert({name:'yy',age:18});

  • 除此之外collection也是可以隐式创建
db.root.insert({_id:88 , 'name':'yyysii', 'hobby':['like','nnbb'], 'intro':{'title':'mu is  like' ,'cotrm':'sss'}});          //隐式创建collection

 db.root.find()             //查看数据库内容
{ "_id" : 88, "name" : "yyysii", "hobby" : [ "like", "nnbb" ], "intro" : { "title" : "mu is  like", "cotrm" : "sss" } }

1.3删除数据库/表

use   该数据库xxx
db.dropDatabase();        //删除该数据库
db.表名xxx.drop();       //删除数据库内表信息

2.MongoDB--增删改查

MongoDB存储的是文档格式,文档是json格式的对象。无论是增删改查都需要通过json格式进行传递。

2.1 增操作(insert)

在MongoDB中可以增加单篇、多篇文档。

db.stu.insert({name:'yy' , num:'92929'});

db,stu.insert({_id:3 ,name:'ydnu' ,num:'egr'});    //指定id

db.stu.insert({name:{x:'li' , ming:'shimin'}, ji:['war','kill']});               //复杂的单文档格式。

db.stu.insert([{_id:5 ,name:'yy',hobby:'swim'},{_id:9,num:'99', nem:'df'},{name:'yy'}]);    //同时写多篇文档

2.2删操作 (remove)

db.stu.remove({name:'dd'});           //后加查询表达式:选项
db.shenji.remove({male:'n'},true);    //每次只删除一条信息
 
db.stu.remove()                      //删除表内所有信息

注意

1: 查询表达式依然是个json对象

2: 查询表达式匹配的行,将被删掉.

3: 如果不写查询表达式,collections中的所有文档将被删掉.

2.3改操作 (update)

db.shenji.update({name:'ff'},{name:'ffy'});
db.shenji.update({name:'ffc'}, {$set:{name:'yy'}});

================ result =============
> db.shenji.find()
{ "_id" : ObjectId("5ca72ff39ff46db4a72f5745"), "name" : "ffy" }
{ "_id" : ObjectId("5ca72ff39ff46db4a72f5746"), "name" : "yy", "male" : "m" }

修改时的赋值表达式

:$set 修改某列的值

$unset 删除某个列

$rename 重命名某个列

$inc 增长某个列 必须是数字型

典型实例

//原数据内容
> db.xuyou.insert({
... name:'wukong',
... jinggu:'ture',
... sex:'m',
... age:500
... })

//修改数据
> db.xuyou.update({name:'wukong'}, { 
... $set:{name:'dzsf'},  
...$unset:{jinggu:1}, 
...$rename:{sex:'gender'},
...$inc:{age:16}
...})

===============result=============
{ "_id" : ObjectId("5ca737a79ff46db4a72f574a"), "name" : "wukong", "jinggu" : "ture", "sex" : "m", "age" : "500" }

{ "_id" : ObjectId("5ca756699ff46db4a72f574b"), "name" : "dzsf", "age" : 516, "gender" : "m" }

对于update而言,如果不加入匹配参数,每次只能修改一行。故我们需要引进新的参数。

  • multi: 是指修改多行(即使查询表达式命中多行,默认也只改1行,如果想改多行,可以用此选项)
> db.biao.update({gender:'n'}, {$set:{gender:'woman'}},{multi:1});

> db.biao.find()

{ "_id" : ObjectId("5ca75baee0fef6d9022eef1a"), "name" : "yhy", "gender" : "m" }
{ "_id" : ObjectId("5ca75baee0fef6d9022eef1b"), "name" : "syy", "gender" : "woman" }
{ "_id" : ObjectId("5ca75baee0fef6d9022eef1c"), "name" : "yhhhy", "gender" : "woman" }

  • Upsert是指没有匹配的行,则直接插入该行.(和mysql中的replace一样)
 db.biao.update({name:'yhhy'}, {$set:{name:'junshiwuyong'}}, {upsert:1});
> db.biao.update({name:'yjy'}, {$set:{name:'wusongdahu'},$setOnInsert:{gender:'man'}},{upsert:1});

============= result =================
{ "_id" : ObjectId("5ca779ec3eab4669f488b85c"), "name" : "junshiwuyong" }
{ "_id" : ObjectId("5ca77bd53eab4669f488b864"), "name" : "wusongdahu", "gender" : "man" }

2.4查操作(find)

db.stu.find()                   //查询所有文档 所有内容

db.stu.find({},{gendre:1})      //查询所有文档,的gender属性 (_id属性默认总是查出来)

db.stu.find({},{gender:1, _id:0})   //查询所有文档的gender属性,且不查询_id属性

db.stu.find({gender:’male’},{name:1,_id:0});   //查询所有gender属性值为male的文档中的name属性


3.MongoDB查询表达式

3.1使用比较运算符查询

[图片上传失败...(image-ea676-1554555623323)]

3.1.1主键为32的商品
> db.goods.find({goods_id:32})
3.1.2不属于第三栏的所有商品($ne)
> db.goods.find({cat_id:{$ne:3}},{goods_id:1, cat_id:1,_id:0})

3.1.3价格高于3000的商品($gt)
> db.goods.find({shop_price:{$gt:3000}}, {goods_name:1,shop_price:1,_id:0})

3.1.4价格小于等于100的商品 ($lte)
> db.goods.find({shop_price:{$lte:100}},{goods_name:1,shop_price:1,_id:0})

3.1.5取出第4栏或者第11栏的商品($in)
db.goods.find({cat_id:{$in:[4,11]}},{goods_name:1,shop_price:1,_id:0,cat_id:1})

3.1.6筛选有共同项的成员信息($all)
> db.xuyou.find({hobby:{$all:['c']}})

3.2使用逻辑运算符查询

image.png
3.2.1价格在100-500之间的商品($and)
> db.goods.find({$and:[{shop_price:{$gte:100}} ,{shop_price:{$lte:500}}]}, {shop_price:1,goods_name:1,_id:0})

3.2.2取出不属于第3栏且不属于第11栏的商品(and,nin, $nor)
//方法一:and
> db.goods.find({$and:[{cat_id:{$ne:3}}, {cat_id:{$ne:11}}]},{cat_id:1,goods_name:1,_id:0});
//方法二:nin
> db.goods.find({cat_id:{$nin:[3,11]}},{cat_id:1,goods_name:1,_id:0})
//方法三:nor
> db.goods.find({$nor:[{cat_id:3} ,{cat_id:11}]}, {cat_id:1,goods_name:1,_id:0})    

3.3使用元素运算符查询

image.png
3.3.1取出goods_id以5为倍数的商品 ($mod)
> db.goods.find({goods_id:{$mod:[5,0]}},{goods_id:1,goods_name:1,_id:0})

3.3.2找出xuyou表中唯一存在age的信息($exists)
>  db.xuyou.find({age:{$exists:1}})

3.3.3查询age字段不同类型的信息($type)
//对于age来说,可以编写成age:‘22’,同时也可以是是age:22
db.biao.find({age:{$type:1}})    //浮点型
db.biao.find({age:{$type:1}})    //字符串类型

3.4使用JS运算符查询

3.4.1条件查询商品信息($where)
> db.goods.find({$where:'this.shop_price>5000'},{shop_price_id:1,goods_name:1,_id:0})

> db.goods.find({$where:'this.shop_price>200 && this.shop_price<500 || this.shop_price>300 && this.price<5000'}, {shop_price:1,goods_name:1,_id:0})
//&& 并且  ||或者
3.4.2条件查询匹配商品开头信息($regex)
db.goods.find({goods_name:{$regex:"诺基亚"}},{_id:0,goods_name:1})

4.MongoDB--游标操作

4.1循环生成1000条数据
> for(var i=0; i<100000; i++) {
... db.data.insert({_id:i+1,title:'hello word',content:'aaa'+i});
... };

4.2游标的使用

  • 游标:通俗的说:游标不是查询结果,而是查询的返回资源或者接口。通过这个接口,你可以逐条读取数据。
4.2.1声明游标
> var mycusor = db.data.find({_id:{$lte:4}})   //定义游标数量
>  print(mycusor.next())         //第一次查询,返回bson格式
[object BSON]

> printjson(mycusor.next())        //第二次查询,游标从2开始计数
{ "_id" : 2, "title" : "hello word", "content" : "aaa1" }

4.2.2判断游标是否到达尽头
> printjson(mycusor.hasNext())
false

> var mycusor = db.data.find({_id:{$lte:4}})
> printjson(mycusor.hasNext())
true

4.2.3循环/(迭代)函数调用显示游标内容
> var mycursor = db.data.find({_id:{$lte:5}})
//方式一:利用while循环实现
> while(mycursor.hasNext()) {
... printjson(mycursor.next());
... }

//方式二:利用for循环实现
> for(var mycursor=db.data.find({_id:{$lte:5}}) ; mycursor.hasNext();) {
... printjson(mycursor.next())
... }

//方式三:利用forEach函数实现
> mycusor.forEach(function(key){printjson(key)});

{ "_id" : 1, "title" : "hello word", "content" : "aaa0" }
{ "_id" : 2, "title" : "hello word", "content" : "aaa1" }
{ "_id" : 3, "title" : "hello word", "content" : "aaa2" }
{ "_id" : 4, "title" : "hello word", "content" : "aaa3" }
{ "_id" : 5, "title" : "hello word", "content" : "aaa4" }

> var mycusor = db.data.find({_id:{$lte:5}})
> mycusor.forEach(function(key){print('you id is '+key._id)});
you id is 1
you id is 2
you id is 3
you id is 4
you id is 5
4.2.4游标在分页中的应用

比如查询1000行(跳过100页取10行),一般我们假设每页有N行,当前是page页就需要跳过前(page-1)*N行,在MongoDB中使用skip()和limit()函数来实现

> var mycursor = db.data.find().skip(99995);
> mycursor.forEach(function(key) {printjson(key)});
{ "_id" : 99996, "title" : "hello word", "content" : "aaa99995" }
{ "_id" : 99997, "title" : "hello word", "content" : "aaa99996" }
{ "_id" : 99998, "title" : "hello word", "content" : "aaa99997" }
{ "_id" : 99999, "title" : "hello word", "content" : "aaa99998" }
{ "_id" : 100000, "title" : "hello word", "content" : "aaa99999" }

查询第901页,每页10条

> var mycursor = db.data.find().skip(9985).limit(10)
> mycursor.forEach(function(key) {printjson(key)});
{ "_id" : 9986, "title" : "hello word", "content" : "aaa9985" }
{ "_id" : 9987, "title" : "hello word", "content" : "aaa9986" }
{ "_id" : 9988, "title" : "hello word", "content" : "aaa9987" }
{ "_id" : 9989, "title" : "hello word", "content" : "aaa9988" }
{ "_id" : 9990, "title" : "hello word", "content" : "aaa9989" }
{ "_id" : 9991, "title" : "hello word", "content" : "aaa9990" }
{ "_id" : 9992, "title" : "hello word", "content" : "aaa9991" }
{ "_id" : 9993, "title" : "hello word", "content" : "aaa9992" }
{ "_id" : 9994, "title" : "hello word", "content" : "aaa9993" }
{ "_id" : 9995, "title" : "hello word", "content" : "aaa9994" }

4.2.5 显示数组 toArray的使用
  • 不要随意使用toArray()。因为:此函数会把所有的行立即以对象的形式组织在内存里。可以在取出少数几行时候用此功能。
> var mycursor = db.data.find().skip(99995).limit(5)
> mycursor.toArray();
[
        {
                "_id" : 99996,
                "title" : "hello word",
                "content" : "aaa99995"
        },
        {
                "_id" : 99997,
                "title" : "hello word",
                "content" : "aaa99996"
        },
        {
                "_id" : 99998,
                "title" : "hello word",
                "content" : "aaa99997"
        },
        {
                "_id" : 99999,
                "title" : "hello word",
                "content" : "aaa99998"
        },
        {
                "_id" : 100000,
                "title" : "hello word",
                "content" : "aaa99999"
        }
]

//调取一行数据
> printjson(mycursor.toArray()[3])

{ "_id" : 99999, "title" : "hello word", "content" : "aaa99998" }


4.MongoDB--索引

  • 索引提高查询速度,降低读入速度,权衡常用的字段查询,不必在太多列上建立索引
  • 在MongoBD中索引可以按字段升序/降序来创建,便于排序
  • 默认是用btree来组织索引文件,同时也允许建立hash索引
索引作用类型 索引性质
单列索引 唯一索引
多列索引 稀疏索引
子文档索引 哈希索引

4.1创建一个MongoDB数据文件

> for(var i=1;i<=1000;i++) {
... db.stu.insert({sn:i,name:'student'+i})
... }

4.2索引作用类型

4.2.1创建/ 查询/ 删除单列索引
//创建索引的两种方式
> db.stu.ensureIndex({name:-1})     //-1 倒序
> db.stu.createIndex({sn:1})        //1  正序
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

//查询索引
> db.stu.getIndexes()
[
        {
                "v" : 2,
                "key" : {
                        "_id" : 1
                },
                "name" : "_id_",
                "ns" : "dd.stu"
        },
        {
                "v" : 2,
                "key" : {
                        "sn" : 1
                },
                "name" : "sn_1",
                "ns" : "dd.stu"
        }
]

//删除索引
> db.stu.dropIndex({name:-1})          //删除单个索引
{ "nIndexesWas" : 3, "ok" : 1 }

> db.stu.dropIndexes()                 //删除所有索引
{
        "nIndexesWas" : 3,
        "msg" : "non-_id indexes dropped for collection",
        "ok" : 1
}

4.2.2添加多列索引
> db.stu.ensureIndex({sn:1,name:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

4.2.3 子文档索引
> db.shop.insert({name:'Nokia',spc:{weight:120,area:'taiwan'}})

> db.shop.insert({name:'sanxing',spc:{weight:100,area:'hangzhou'}})

> db.shop.find({'spc.area':'taiwan'})      //查询子文档索引     
{ "_id" : ObjectId("5ca9780c9d13524750104f1e"), "name" : "Nokia", "spc" : { "weight" : 120, "area" : "taiwan" } }


//创建子文档索引
> db.shop.ensureIndex({'spc.area':1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1

4.3索引性质

4.3.1唯一索引
> db.stu.insert({email:'a@163.com'})

> db.stu.insert({email:'b@163.com'})

//创建唯一索引:如果加c@163.com有且只能加入一个
> db.stu.createIndex({email:1},{unique:true})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

4.3.2稀疏索引

稀疏索引的特点:如果针对field做索引,对于不含filed列的文档将不建立索引。与之相对,普通索引:会把该文档的field列的值认为是null并建立索引

> db.stu.find()
{ "_id" : ObjectId("5cab2e2b1fa81e696a0cc1f7"), "email" : "a@163.com" }
{ "_id" : ObjectId("5cab2e321fa81e696a0cc1f8"), "email" : "b@163.com" }
{ "_id" : ObjectId("5cab2fa81fa81e696a0cc1f9"), "email" : "c@163.com" }
{ "_id" : ObjectId("5cab31021fa81e696a0cc1fc") }
> db.stu.ensureIndex({email:1},{sparse:1})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}
> db.tea.find({email:null})

4.3.3 哈希索引
> db.foo.insert([{title:'hello'},{title:'word'}])

> db.foo.ensureIndex({title:'hashed'})
{
        "createdCollectionAutomatically" : false,
        "numIndexesBefore" : 1,
        "numIndexesAfter" : 2,
        "ok" : 1
}

四、MongoBD数据库管理

1.MongoBD用户管理

1.1修改配置文件

在 /etc/mongo.conf中添加配置内容

security:
   # 启用或禁用基于角色的访问控制(RBAC)来控制每个用户对数据库资源和操作的访问
   # disabled | enabled
    authorization: enabled   //此行前必须有两个空格

Mongo 安装好后,默认是 disabled 的,要想启用认证,必须先创建一个用户管理员账号。这个账号专门用于创建用户,包括给这些用户赋予不同的角色,并且可以针对不同的数据库赋予不同的角色。

1.2 创建用户

1.2.1创建管理用户
> use admin

> db.createUser(
...   {
...     user: "dba",
...     pwd: "dba",
...     roles: [ { role: "userAdminAnyDatabase", db: "admin" } ]
...   }
... )

//退出重新认证即可
[root@localhost ~]# mongo
> use admin
switched to db admin
> db.auth('dba','dba')
1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB


在创建用户时最重要的就是权限的选择问题

  • user:用户名
  • pwd:密码
  • roles:指定用户的角色,可以用一个空数组给新用户设定空角色;在roles字段,可以指定内置角色和用户定义的角色。

​ 1.数据库用户角色:read、readWrite;

  1. 数据库管理角色:dbAdmin、dbOwner、userAdmin;
  2. 集群管理角色:clusterAdmin、clusterManager、clusterMonitor、hostManager;
  3. 备份恢复角色:backup、restore;
  4. 所有数据库角色:readAnyDatabase、readWriteAnyDatabase、userAdminAnyDatabase、dbAdminAnyDatabase
  5. 超级用户角色:root
    // 这里还有几个角色间接或直接提供了系统超级用户的访问(dbOwner 、userAdmin、userAdminAnyDatabase)
  6. 内部角色:__system

其中的具体角色问题

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

1.2.2创建root超级用户
> use admin
switched to db admin
> db.auth("dba","dba")
1
> db.createUser({
... user:"wudi",
... pwd:"1",
... roles:[{role:"root",db:"admin"}]
... })

> use admin
switched to db admin
> db.auth("wudi","1")
1
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
stu     0.000GB
> use stu
switched to db stu
> show tables
foo

1.2.3创建单数据库读写用户
> use stu
switched to db stu
> db.createUser({
... user:"yy",
... pwd:"1",
... roles:[{role:"readWrite",db:"stu"}]
... })

//退出数据库后重新登录
[root@localhost ~]# mongo
MongoDB shell version v3.6.12
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("7bb6702e-9398-4449-a9a8-279b95362845") }
MongoDB server version: 3.6.12
> use stu
switched to db stu
> db.auth('yy','1')
1
> show tables
> db.foo.insert({name:'effcf',age:19})
WriteResult({ "nInserted" : 1 })
> db.foo.insert({name:'rgfv',age:22})
WriteResult({ "nInserted" : 1 })
> db.foo.find()
{ "_id" : ObjectId("5c839f9d5cdcf23c553fe98a"), "name" : "effcf", "age" : 19 }
{ "_id" : ObjectId("5c839fa65cdcf23c553fe98b"), "name" : "rgfv", "age" : 22 }

1.2.4创建单数据库只读用户
> use admin
switched to db admin
> db.auth('dba','dba')
1
> use stu
>  db.createUser({
...  user:"yt",
...  pwd:"1",
... roles:[{role:"read",db:"stu"}]
... })

[root@localhost ~]# mongo
MongoDB shell version v3.6.12
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("a48cb5be-b7fa-453d-92e7-6cf8cabc98c3") }
MongoDB server version: 3.6.12
> use stu
switched to db stu
> db.auth("yt","1")
1
> show tables
foo
> db.foo.find()
{ "_id" : ObjectId("5c839f9d5cdcf23c553fe98a"), "name" : "effcf", "age" : 19 }
{ "_id" : ObjectId("5c839fa65cdcf23c553fe98b"), "name" : "rgfv", "age" : 22 }
> db.foo.insert({name:'dd',age:88})
WriteResult({
        "writeError" : {
                "code" : 13,
                "errmsg" : "not authorized on stu to execute command { insert: \"foo\", ordered: true, lsid: { id: UUID(\"a48cb5be-b7fa-453d-92e7-6cf8cabc98c3\") }, $db: \"stu\" }"
        }
})


1.3管理用户

> use admin
switched to db admin
> db.auth('dba','dba')
1

> db.system.users.find().pretty()
{
        "_id" : "admin.dba",
        "user" : "dba",
        "db" : "admin",
        "credentials" : {
                "SCRAM-SHA-1" : {
                        "iterationCount" : 10000,
                        "salt" : "KEmJdox7dvQzfUGRWuTVXQ==",
                        "storedKey" : "ONHWxuh4wU1RZFR8Al/oX6Z1VWw=",
                        "serverKey" : "Pw8n1yYG71zihd+5MyZ4JWYR+Yg="
                }
        },
        "roles" : [
                {
                        "role" : "userAdminAnyDatabase",
                        "db" : "admin"
                }
        ]
}
{
        "_id" : "stu.yy",
        "user" : "yy",
        "db" : "stu",
        "credentials" : {
                "SCRAM-SHA-1" : {
                        "iterationCount" : 10000,
                        "salt" : "W0Di3xc3oehmnIyg4Sm7JA==",
                        "storedKey" : "9NovDOeoMUdY5d6UW8a8Jm7iKW0=",
                        "serverKey" : "8bAt6hWPHMa2FPbnsoRiBFUdKSI="
                }
        },
        "roles" : [
                {
                        "role" : "readWrite",
                        "db" : "stu"
                }
        ]
}
{
        "_id" : "stu.yt",
        "user" : "yt",
        "db" : "stu",
        "credentials" : {
                "SCRAM-SHA-1" : {
                        "iterationCount" : 10000,
                        "salt" : "Js4z7J4b+vRPvzYRGYqEOg==",
                        "storedKey" : "/vpk/EuyBfMCiKqDWoqZvOCKprU=",
                        "serverKey" : "Z7riO2r2MBQXvvJbBAxWW6mxbjs="
                }
        },
        "roles" : [
                {
                        "role" : "read",
                        "db" : "stu"
                }
        ]
}
{
        "_id" : "admin.wudi",
        "user" : "wudi",
        "db" : "admin",
        "credentials" : {
                "SCRAM-SHA-1" : {
                        "iterationCount" : 10000,
                        "salt" : "yexzX4oxSWEoynisD7MDFg==",
                        "storedKey" : "RgZGju6pUtX1ompTS7b9sXpMM6M=",
                        "serverKey" : "bbLRcO61HTl2j/l+5ZVqjHXoT4A="
                }
        },
        "roles" : [
                {
                        "role" : "root",
                        "db" : "admin"
                }
        ]
}

2. MongoD数据库的备份与还原

2.1 MongoDB数据导出(mongoexport)

  • mongoexport遭遇Authentication failed:

    需要添加 --authenticationDatabase=admin ,即可导出成功

查询工具的各个参数

general options:
--help print usage
--version print the tool version and exit

verbosity options:
-v, --verbose more detailed log output (include multiple times for
more verbosity, e.g. -vvvvv)
--quiet hide all log output

connection options:
-h, --host= mongodb host to connect to (setname/host1,host2 for
replica sets)
--port= server port (can also use --host hostname:port)

ssl options:
--ssl connect to a mongod or mongos that has ssl enabled
--sslCAFile= the .pem file containing the root certificate chain from
the certificate authority
--sslPEMKeyFile= the .pem file containing the certificate and key
--sslPEMKeyPassword= the password to decrypt the sslPEMKeyFile, if necessary
--sslCRLFile= the .pem file containing the certificate revocation list
--sslAllowInvalidCertificates bypass the validation for server certificates
--sslAllowInvalidHostnames bypass the validation for server name
--sslFIPSMode use FIPS mode of the installed openssl library

authentication options:
-u, --username= username for authentication
-p, --password= password for authentication
--authenticationDatabase= database that holds the user's credentials
--authenticationMechanism= authentication mechanism to use

namespace options:
-d, --db= database to use
-c, --collection= collection to use

output options:
-f, --fields= comma separated list of field names (required for
exporting CSV) e.g. -f "name,age"
--fieldFile= file with field names - 1 per line
--type= the output format, either json or csv (defaults to
'json')
-o, --out= output file; if not specified, stdout is used
--jsonArray output to a JSON array rather than one object per line
--pretty output JSON formatted to be human-readable

querying options:
-q, --query= query filter, as a JSON string, e.g., '{x:{gt:1}}' -k, --slaveOk allow secondary reads if available (default true) --forceTableScan force a table scan (do not usesnapshot)
--skip= number of documents to skip
--limit= limit the number of documents to export

--sort= sort order, as a JSON string, e.g. '{x:1}'
//导出全部数据
[root@localhost tmp]# mongoexport -u wudi -p 1 -d stu -c foo  -o /tmp/sky.stu.json --authenticationDatabase=admin

2019-03-09T23:54:16.480+0800    connected to: localhost
2019-03-09T23:54:16.480+0800    exported 2 records


//导出数据中选定内容
[root@localhost tmp]# mongoexport -u wudi -p 1 -d biao -c stu -f "sn,name" -q '{sn:{$lte:1000}}' -o /tmp/test.ss.json --authenticationDatabase=admin

2019-03-09T23:43:54.067+0800    connected to: localhost
2019-03-09T23:43:54.121+0800    exported 1000 records

//导出CSV格式数据内容(CSV格式便于和传统数据库交换数据)
[root@localhost tmp]# mongoexport -u wudi -p 1 -d biao -c stu -f "sn,name" -q '{sn:{$lte:1000}}' --csv -o /tmp/test.ss.csv --authenticationDatabase=admin
2019-04-12T11:07:26.420+0800    csv flag is deprecated; please use --type=csv instead

2019-04-12T11:07:26.425+0800    connected to: localhost
2019-04-12T11:07:26.462+0800    exported 1000 records

2.2 MongoDB数据导入(mongoimport)

//导入json格式数据
[root@localhost tmp]# mongoimport -u wudi -p 1 -d people -c age --type json --file /tmp/test.ss.json --authenticationDatabase=admin

2019-04-12T11:26:25.030+0800    connected to: localhost
2019-04-12T11:26:25.279+0800    imported 1000 documents

//导入csv格式数据(1)
[root@localhost tmp]# mongoimport -u wudi -p 1 -d people -c name --type csv -f "sn,name" --file /tmp/te.ceshi.csv --authenticationDatabase=admin

2019-04-12T11:33:24.289+0800    connected to: localhost
2019-04-12T11:33:24.329+0800    imported 11 documents

经过观察看出导入时将标题修改为第一行数据
> db.auth("wudi","1")
1
> use people
switched to db people
> db.name.find()
{ "_id" : ObjectId("5cb0070422a89db7a5941f4c"), "sn" : "sn", "name" : "name" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f4d"), "sn" : 1, "name" : "student1" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f4e"), "sn" : 2, "name" : "student2" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f4f"), "sn" : 3, "name" : "student3" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f50"), "sn" : 5, "name" : "student5" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f51"), "sn" : 6, "name" : "student6" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f52"), "sn" : 7, "name" : "student7" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f53"), "sn" : 8, "name" : "student8" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f54"), "sn" : 4, "name" : "student4" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f55"), "sn" : 10, "name" : "student10" }
{ "_id" : ObjectId("5cb0070422a89db7a5941f56"), "sn" : 9, "name" : "student9" }

//导入CSV数据格式(2)
[root@localhost tmp]# mongoimport -u wudi -p 1 -d people -c hobby --headerline --type csv --file /tmp/te.ceshi.csv --authenticationDatabase=admin

2019-04-12T14:20:08.711+0800    connected to: localhost
2019-04-12T14:20:08.743+0800    imported 10 documents

2.3 MongoDB数据导入(mongodump)

mongodump 导出二进制bson结构的数据及其索引信息。

规律:

导出的文件放在database命名的目录文件下

每个表导出2个文件,分别是bson结构的数据文件,json的索引信息

如果不声明表名。导出所有表信息

//导出坤库内全部信息
[root@localhost dump]# mongodump -u wudi -p 1 -d people --authenticationDatabase=admin
2019-04-12T14:34:36.805+0800    writing people.age to 
2019-04-12T14:34:36.805+0800    writing people.name to 
2019-04-12T14:34:36.805+0800    writing people.hobby to 
2019-04-12T14:34:36.807+0800    done dumping people.name (11 documents)
2019-04-12T14:34:36.810+0800    done dumping people.age (1000 documents)
2019-04-12T14:34:36.815+0800    done dumping people.hobby (10 documents)

//导出指定表信息
[root@localhost dump]# mongodump -u wudi -p 1 -d people -c age --authenticationDatabase=admin


2.4 MongoDB数据导出(mongorestore)

[root@localhost people]# mongorestore -u wudi -p 1   --authenticationDatabase=admin  -d people /tmp/dump/dump/people


2019-04-12T14:48:25.223+0800    the --db and --collection args should only be used when restoring from a BSON file. Other uses are deprecated and will not exist in the future; use --nsInclude instead
2019-04-12T14:48:25.223+0800    building a list of collections to restore from /tmp/dump/dump/people dir
2019-04-12T14:48:25.224+0800    reading metadata for people.age from /tmp/dump/dump/people/age.metadata.json
2019-04-12T14:48:25.430+0800    restoring people.age from /tmp/dump/dump/people/age.bson
2019-04-12T14:48:25.484+0800    reading metadata for people.name from /tmp/dump/dump/people/name.metadata.json
2019-04-12T14:48:25.484+0800    reading metadata for people.hobby from /tmp/dump/dump/people/hobby.metadata.json
2019-04-12T14:48:25.504+0800    restoring people.name from /tmp/dump/dump/people/name.bson
2019-04-12T14:48:25.530+0800    no indexes to restore
2019-04-12T14:48:25.530+0800    finished restoring people.name (11 documents)
2019-04-12T14:48:25.530+0800    restoring people.hobby from /tmp/dump/dump/people/hobby.bson
2019-04-12T14:48:25.559+0800    no indexes to restore
2019-04-12T14:48:25.559+0800    finished restoring people.age (1000 documents)
2019-04-12T14:48:25.578+0800    no indexes to restore
2019-04-12T14:48:25.578+0800    finished restoring people.hobby (10 documents)
2019-04-12T14:48:25.578+0800    done

[root@localhost people]# mongo
MongoDB shell version v3.6.12
connecting to: mongodb://127.0.0.1:27017/?gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("177a96e5-5bc4-43ce-be78-9a924d5ae568") }
MongoDB server version: 3.6.12
> use admin
switched to db admin
> db.auth("wudi","1")
1
> use people
switched to db people
> show tables
age
hobby
name

3. MongoDB数据库 - 复制集(replication )

含义:多台服务器维护相同的数据副本,提高服务器的可用性。

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

推荐阅读更多精彩内容