数据库基础之14(MongoDB基本数据类型,数据导入导出,数据备份与恢复)

目录

1、MongoDB

1-1、MongoDB概述

1-2、搭建MongoDB服务器

1-3、mongodb常用管理命令

1-4、数据库名可以是满足以下条件的任意UTF-8字符串

1-5、合法的集合名

 1-6、文档基本管理

2、基本数据类型

2-1、字符string/布尔bool/空null

2-2、数值/数组array

2-3、代码/日期/对象

2-4、内嵌/正则表达式

3、数据导入导出

3-1、数据导出

3-2、数据导入

4、数据备份与恢复

4-1、数据备份

4-2、数据恢复


1、MongoDB


1-1、MongoDB概述

• 介于关系数据库和非关系数据库之间的产品

  • – 一个基于分布式文件存储的数据库。
  • – 由C++语言编写。旨在为WEB应用提供可扩展的高性能数据存储解决方案。
  • – MongoDB 将数据存储为一个文档,数据结构由键值(key=>value)对组成。
  • – MongoDB 文档类似于 JSON 对象。字段值可以包含其他文档,数组及文档数组。

特点

  1. – 安装简单
  2. – 面向文档存储,操作比较简单容易
  3. – 支持丰富的查询表达
  4. – 可以设置任何属性的索引
  5. – 支持主流编程语言RUBY|PYTHON|JAVA|PHP|C++
  6. – 支持副本集(集群),分片

1-2、搭建MongoDB服务器
 

安装
• 免安装,解压后即可使用
[root@bogon ~]# mkdir /usr/local/mongodb------先自己创建一个工作目录
[root@bogon ~]# tar -zxf mongodb-linux-x86_64-rhel70-3.6.3.tgz
[root@bogon ~]# cp -r mongodb-linux-x86_64-rhel70-3.6.3/bin /usr/local/mongodb/
vim /etc/profile
export PATH=/usr/local/mongodb/bin:$PATH------将/usr/local/mongodb/bin添加到执行文件路径的变量:$PATH
wq:
source /etc/profile------刷新配置文件,使配置文件生效
[root@bogon ~]# cd /usr/local/mongodb/
[root@bogon mongodb]# mkdir etc-----用来存配置文件
[root@bogon mongodb]# mkdir log-----存日志
[root@bogon mongodb]# mkdir -p data/db------存数据
 
• 手动创建服务主配置文件
[root@bogon ~]# vim /usr/local/mongodb/etc/mongodb.conf
logpath=/usr/local/mongodb/log/mongodb.log-----指定日志文件名
logappend=true ---------追加的方式记录日志信息
dbpath=/usr/local/mongodb/data/db -------指定数据库目录
fork=true ------------守护进程方式运行
bind_ip=192.168.4.51------连接地址
port=27051-----连接端口
• 启动服务
– ]# ./bin/mongod -f /usr/local/mongodb/etc/mongodb.conf
• 查看进程
– ]# ps -C mongod
• 查看端口
– ]# netstat -utnlp | grep :27017
vim /etc/profile
alias startmongod='mongod -f /usr/local/mongodb/etc/mongodb.conf'----起服务startmongod
alias stopmongod='mongod -f /usr/local/mongodb/etc/mongodb.conf --shutdown'----停服务stopmongod
source /etc/profile
• 本地连接,默认没有密码
[root@host51 mongodb]# mongo
[root@bogon ~]# /usr/local/mongodb/bin/mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
……
> show dbs     -------显示已有的库
admin 0.000GB
config 0.000GB
local 0.000GB
> use local-----切换到local库,若没有这个库,则延时创建
switched to db local
> db-----用来显示当前在哪个库里
admin
> show tables------显示已有的集合– show collections 或 show tables
startup_log           
> exit                                                     #断开连接
bye


1-3、mongodb常用管理命令

• 库管理命令: 查看 创建 切换 删除
– show dbs  -----------  查看已有的库
– db    -------------显示当前所在的库
– use 库名 ---------切换库,若库不存在的话 自动延时创建库
– show collections 或 show tables  ----------查看库下已有的集合
– db.dropDatabase()  ---------删除当前所在的库
 

1-4、数据库名可以是满足以下条件的任意UTF-8字符串

  1. – 不能是空字符串("")。
  2. – 不得含有' '(空格)、. 、$、/、\和\0 (空字符)。
  3. – 应全部小写。
  4. – 最多64字节。

1-5、合法的集合名

  1. – 集合名不能是空字符串""。
  2. – 集合名不能含有\0字符(空字符),这个字符表示集合名的结尾。
  3. – 集合名不能以"system."开头,这是为系统集合保留的前缀。
  4. – 用户创建的集合名字不能含有保留字符。

 
1-6、文档基本管理

• 文档 : 类似于MySQL表里的记录
• 文档管理命令: 查看 统计 添加 删除
– db.集合名.find()----返回当前集合所有的文档
– db.集合名.findOne() -----返回当前集合的第一条文档
– db.集合名.find({条件})-----返回符合条件的集合里的文档
– db.集合名.count()------统计集合文档数量
– db.集合名.insert({“name”:”jim”})
– db.集合名.remove({条件}) --------删除与条件匹配的所有文档

– db.集合名.remove({}) #删除所有文档------删除当前集合中的所有文档,但并没有删除集合

– db.集合名.drop()     -------删除集合
– db.集合名.save({'',''}) -------创建集合,集合不存在时,自动创建并添加文档
实例:
>use huhu
switched to db huhu
> show dbs
admin   0.000GB
config  0.000GB
local   0.000GB
> db
huhu
> db.user.save({name:"lucy",id:"23"})-----创建集合并填充文档
WriteResult({ "nInserted" : 1 })
> show tables
user
> show dbs
admin   0.000GB
config  0.000GB
huhu    0.000GB
local   0.000GB
> db.user.save({name:"lili",id:"24"})
WriteResult({ "nInserted" : 1 })
> db.user.find()-------查看当前集合所有文档
{ "_id" : ObjectId("5b614e732b3cb0bcaf007a4e"), "name" : "lucy", "id" : "23" }
{ "_id" : ObjectId("5b614eaa2b3cb0bcaf007a4f"), "name" : "lili", "id" : "24" }
> db.user.count()
2
> db.user.insert({name:"xiaohong",num:"456789123",sex:"girl"})
WriteResult({ "nInserted" : 1 })
> db.user.find({name:"xiaohong"})------列出符合条件的文档
{ "_id" : ObjectId("5b614f472b3cb0bcaf007a50"), "name" : "xiaohong", "num" : "456789123", "sex" : "girl" }
> db.user.remove({name:"xiaohong"})------删除符合条件的文档
WriteResult({ "nRemoved" : 1 })
> db.user.find()
{ "_id" : ObjectId("5b614e732b3cb0bcaf007a4e"), "name" : "lucy", "id" : "23" }
{ "_id" : ObjectId("5b614eaa2b3cb0bcaf007a4f"), "name" : "lili", "id" : "24" }
> db.user.remove({})-----删除当前集合所有文档
WriteResult({ "nRemoved" : 2 })
> db.user.find()
> show tables
user
> db.user.drop()-----删掉当前集合
true
> show tables
>
 

2、基本数据类型

• mongodb数据类型总结

  1. – 字符串类型
  2. – 布尔类型------true/false,{x:true}
  3. – 空  ------{x:null}
  4. – 正则--------{x:/正则表达式/}
  5. – 数值类型------{x:NumberInt(3)},{x:NumberLong(3)}
  6. – 数组-------{x : [“a“,“b”,”c”]}
  7. – 代码-------{x: function( ){/* 代码 */}}
  8. – 日期------- {x:new Date( )}
  9. – 对象--------{x: ObjectId() }
  10. – 内嵌-------类似于redis里的hash表,一个key下有多个字段,一个字段一个值


2-1、字符string/布尔bool/空null

• 字符串string
– UTF-8字符串都可以表示为字符串类型的数据
– {name:”张三”} 或 { school:“tarena”}
• 布尔bool
– 布尔类型有两个值true和false,{x:true}
• 空null
– 用于表示空值或者不存在的字段,{x:null}

实例:
> db.a1.save({name:"wangyi",id:1})
WriteResult({ "nInserted" : 1 })
> db.a1.save({name:"wanger",id:2,marry:true})
WriteResult({ "nInserted" : 1 })
> db.a1.save({name:"wangsan",id:3,marry:false,money:null})
WriteResult({ "nInserted" : 1 })
> db.a1.save({name:"wang四",id:4,marry:false,money:null})
WriteResult({ "nInserted" : 1 })
> db.a1.find()
{ "_id" : ObjectId("5b61524c2b3cb0bcaf007a51"), "name" : "wangyi", "id" : 1 }
{ "_id" : ObjectId("5b61526d2b3cb0bcaf007a52"), "name" : "wanger", "id" : 2, "marry" : true }
{ "_id" : ObjectId("5b6152ae2b3cb0bcaf007a53"), "name" : "wangsan", "id" : 3, "marry" : false, "money" : null }
{ "_id" : ObjectId("5b6152c82b3cb0bcaf007a54"), "name" : "wang四", "id" : 4, "marry" : false, "money" : null }
 

2-2、数值/数组array

• 数值
– shell默认使用64为浮点型数值。{x:3.14}或{x:3}。
– NumberInt(4字节整数){x:NumberInt(3)}-----带小数点,不报错,但存入的只是小数点前的整数
– NumberLong(8字节整数){x:NumberLong(3)}-------带小数点,直接报错
 
• 数组array
– 数据列表或数据集可以表示为数组
– {x : [“a“,“b”,”c”]}
> db.a2.save({name:"xiaohong",hobby:["film","game","eat","sleep"]})
WriteResult({ "nInserted" : 1 })
> db.a2.find()
{ "_id" : ObjectId("5b61557d2b3cb0bcaf007a55"), "name" : "xiaohong", "hobby" : [ "film", "game", "eat", "sleep" ] }


2-3、代码/日期/对象

• 代码
– 查询和文档中可以包括任何JavaScript代码
– {x: function( ){/* 代码 */}}
> db.a3.save({language:"php",code:function(){/* <?php echo "hello world"; ?> */},hobby:"sleep"})
WriteResult({ "nInserted" : 1 })
> db.a3.find()
{ "_id" : ObjectId("5b61574f2b3cb0bcaf007a56"), "language" : "php", "code" : { "code" : "function (){/* <?php echo \"hello world\"; ?> */}" }, "hobby" : "sleep" }
 
• 日期
– 日期被存储为自新纪元依赖经过的毫秒数,不存储时区
– {x:new Date( )}
> db.a4.save({name:"harry",birthday:new Date()})
WriteResult({ "nInserted" : 1 })
> db.a4.find()
{ "_id" : ObjectId("5b6158492b3cb0bcaf007a57"), "name" : "harry", "birthday" : ISODate("2018-08-01T06:50:49.405Z") }
 
• 对象
– 对象id是一个12字节的字符串,是文档的唯一标识-------------该标示号自动生成,并且唯一
– {x: ObjectId() }
> db.a5.save({name:"harry",id:ObjectId(),sex:"girl"})
WriteResult({ "nInserted" : 1 })
> db.a5.find()
{ "_id" : ObjectId("5b6159512b3cb0bcaf007a59"), "name" : "harry", "id" : ObjectId("5b6159512b3cb0bcaf007a58"), "sex" : "girl" }
 

2-4、内嵌/正则表达式

• 内嵌
– 文档可以嵌套其他文档,被嵌套的文档作为值来处理-------类似于redis里的hash表,一个key下有多个字段,一个字段一个值
> db.a6.save({ywzd:{writer:"dmy",pay:68,version:"v3"}})
WriteResult({ "nInserted" : 1 })
> db.a6.save({class:{num:90,avage:26,sex:"boy"}})
WriteResult({ "nInserted" : 1 })
> db.a6.find()
{ "_id" : ObjectId("5b615e2d2b3cb0bcaf007a5a"), "ywzd" : { "writer" : "dmy", "pay" : 68, "version" : "v3" } }
{ "_id" : ObjectId("5b615eb52b3cb0bcaf007a5b"), "class" : { "num" : 90, "avage" : 26, "sex" : "boy" } }
 
• 正则表达式
– 查询时,使用正则表达式作为限定条件
– {x:/正则表达式/}
> db.a7.save({jbname:"shell",rcode:/.$/})
WriteResult({ "nInserted" : 1 })
> db.a7.find()
{ "_id" : ObjectId("5b615ff22b3cb0bcaf007a5c"), "jbname" : "shell", "rcode" : /.$/ }
 

3、数据导入导出

3-1、数据导出

• 语法格式1
– #mongoexport [--host IP地址 --port 端口 ]-d 库名 -c 集合名 -f 字段名1,字段名2 --type=csv > 目录名/文件名.csv------------假如bind_ip=127.0.0.1,port=27017的话,可以不用指定[--host IP地址 --port 端口 ]

 
• 语法格式2
– #mongoexport --host IP地址 --port 端口-库名 -c 集合名 -q ‘{ 条件}’ -f 字段名1,字段名2--type=csv > 目录名/文件名.csv
注意:导出为csv格式必须使用-f指定字段名列表!!!
 
 
• 语法格式3
#mongoexport [ --host IP地址 --port 端口 ]-d 库名 -c 集合名 [ -q ‘{ 条件 }’ –f 字段列表]--type=json > 目录名/文件名.json
 

3-2、数据导入

• 语法格式1
– #mongoimport –host IP地址 – port 端口-d 库名 – c 集合名 -type=json 目录名/文件名.json
 
• 语法格式2
– #mongoimport –host IP地址 – port 端口 -d 库名 – c 集合名 --type=csv --headerline [--drop] 目录名/文件名.csv

注意:导入数据时库和集合不存在时,会创建库和集合后导入数据反之以追加的方式导入数据到集合里,使用--drop选项可以删除原有数据后导入新数据 --headerline 忽略标题

[root@host51 mongodb]# cat /opt/a1.csv
name
wangyi
wanger
wangsan
wang四
[root@host51 mongodb]# mongoimport --host 192.168.4.51 --port 27051 -d zlj -c ypf --type=csv --headerline /opt/a1.csv
2018-08-01T16:38:16.563+0800    connected to: 192.168.4.51:27051
2018-08-01T16:38:16.685+0800    imported 4 documents-----导入四个文档
[root@host51 mongodb]# mongo --host 192.168.4.51 --port 27051
> show dbs
admin   0.000GB
config  0.000GB
huhu    0.000GB
local   0.000GB
zlj     0.000GB
> use zlj
switched to db zlj
> show tables
ypf
> db.ypf.find()
{ "_id" : ObjectId("5b617178e4ffddd428c72a7d"), "name" : "wangyi" }
{ "_id" : ObjectId("5b617178e4ffddd428c72a7e"), "name" : "wanger" }
{ "_id" : ObjectId("5b617178e4ffddd428c72a7f"), "name" : "wangsan" }
{ "_id" : ObjectId("5b617178e4ffddd428c72a80"), "name" : "wang四" }
 

实例1:
[root@host51 mongodb]# mongoexport --host 192.168.4.51 --port 27051 -d huhu -c a1 -f name --type=csv > /opt/a1.csv---csv格式必须加-f  字段名1,字段名2.。。。
2018-08-01T15:57:25.499+0800    connected to: 192.168.4.51:27051
2018-08-01T15:57:25.500+0800    exported 4 records
[root@host51 mongodb]# cat /opt/a1.csv
name
wangyimo
wanger
wangsan
wang四
实例2:
> use userdb
switched to db userdb
> show tables
> db.coluser.save({name:"yaya",password:"x",uid:1,gid:1,commetn:"my friends",homedir:"/home/yaya",shell:"/bin/bash"})--------先创建一个类似于/etc/passwd的集合,方便后期参照其导出文件格式
WriteResult({ "nInserted" : 1 })
> exit
bye
[root@host51 mongodb]# mongoexport --host 192.168.4.51 --port 27051 -d userdb -c coluser -f name,password,uid,gid,comment,homedir,shell --type=csv > /opt/coluser.csv-----将该集合导出
2018-08-01T16:54:18.520+0800    connected to: 192.168.4.51:27051
2018-08-01T16:54:18.521+0800    exported 1 record
[root@host51 mongodb]# cat /opt/coluser.csv------查看导出的文件格式
name,password,uid,gid,comment,homedir,shell
yaya,x,1,1,,/home/yaya,/bin/bash

[root@host51 mongodb]# cp /etc/passwd /opt------------先复制一份
[root@host51 mongodb]# sed -i 's/:/,/g' /opt/passwd------将passwd文件中的所有分号换为逗号
[root@host51 mongodb]# vim /opt/passwd-----检查一下
[root@host51 mongodb]# sed -i '$r /opt/passwd' /opt/coluser.csv ----读到/opt/coluser.csv最后一行时写入/opt/passwd文件的内容
[root@host51 mongodb]# vim /opt/coluser.csv-----查看一下
[root@host51 mongodb]# sed -n '$=' /opt/coluser.csv------查看一下共有多少行
44
[root@host51 mongodb]# mongoimport --host 192.168.4.51 --port 27051 -d userdb -c coluser --headerline --type=csv --drop /opt/coluser.csv -----进行数据导入,因为忽略标题,并且清空原有coluser集合所有内容,故这里导入的是44-1=43行,导入数据完整
2018-08-01T17:06:41.055+0800    connected to: 192.168.4.51:27051
2018-08-01T17:06:41.056+0800    dropping: userdb.coluser
2018-08-01T17:06:41.183+0800    imported 43 documents
[root@host51 mongodb]# mongo --host 192.168.4.51 --port 27051-----连上数据库
> use userdb---进入对应的库
switched to db userdb
> db.coluser.find()-----检查内容是否导入成功
{ "_id" : ObjectId("5b617821e4ffddd428c72ab2"), "name" : "yaya", "password" : "x", "uid" : 1, "gid" : 1, "comment" : "", "homedir" : "/home/yaya", "shell" : "/bin/bash" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab3"), "name" : "root", "password" : "x", "uid" : 0, "gid" : 0, "comment" : "root", "homedir" : "/root", "shell" : "/bin/bash" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab4"), "name" : "bin", "password" : "x", "uid" : 1, "gid" : 1, "comment" : "bin", "homedir" : "/bin", "shell" : "/sbin/nologin" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab5"), "name" : "daemon", "password" : "x", "uid" : 2, "gid" : 2, "comment" : "daemon", "homedir" : "/sbin", "shell" : "/sbin/nologin" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab6"), "name" : "adm", "password" : "x", "uid" : 3, "gid" : 4, "comment" : "adm", "homedir" : "/var/adm", "shell" : "/sbin/nologin" }
..........


4、数据备份与恢复

4-1、数据备份


• 备份数据所有库到当前目录下的dump目录下------dump目录会自动创建
# mongodump [ --host ip 地址 --port 端口 ]
[root@host51 opt]# mongodump --host 192.168.4.51 --port 27051---------假如bind_ip=127.0.0.1,port=27017的话,可以不用指定[--host IP地址 --port 端口 ]
2018-08-01T17:31:06.792+0800    writing admin.system.version to
2018-08-01T17:31:06.793+0800    done dumping admin.system.version (1 document)
2018-08-01T17:31:06.793+0800    writing userdb.coluser to
2018-08-01T17:31:06.793+0800    writing huhu.a1 to
2018-08-01T17:31:06.794+0800    writing zlj.ypf to
2018-08-01T17:31:06.794+0800    writing huhu.a6 to
2018-08-01T17:31:06.796+0800    done dumping userdb.coluser (43 documents)
2018-08-01T17:31:06.796+0800    writing huhu.a5 to
2018-08-01T17:31:06.796+0800    done dumping huhu.a1 (4 documents)
2018-08-01T17:31:06.796+0800    writing huhu.a7 to
2018-08-01T17:31:06.797+0800    done dumping huhu.a5 (1 document)
2018-08-01T17:31:06.797+0800    writing huhu.a4 to
2018-08-01T17:31:06.798+0800    done dumping huhu.a7 (1 document)
2018-08-01T17:31:06.798+0800    writing huhu.a2 to
2018-08-01T17:31:06.799+0800    done dumping huhu.a4 (1 document)
2018-08-01T17:31:06.799+0800    writing huhu.a3 to
2018-08-01T17:31:06.799+0800    done dumping huhu.a2 (1 document)
2018-08-01T17:31:06.800+0800    done dumping huhu.a3 (1 document)
2018-08-01T17:31:06.801+0800    done dumping zlj.ypf (4 documents)
2018-08-01T17:31:06.801+0800    done dumping huhu.a6 (2 documents)
[root@host51 opt]# ls dump/
admin  huhu  userdb  zlj
 
• 备份时指定备份的库和备份目录
# mongodump [ --host ip地址 --port 端口 ] -d 数据库名
-c 集合名 -o 目录
备份到的目录无需事先创建 备份时指定即可!!
[root@host51 opt]# mongodump --host 192.168.4.51 --port 27051 -d userdb -c coluser -o /opt/coluser
2018-08-01T17:32:38.666+0800    writing userdb.coluser to
2018-08-01T17:32:38.668+0800    done dumping userdb.coluser (43 documents)
[root@host51 opt]# ls coluser
userdb
 
• 查看bson文件内容
[root@host51 opt]# ls coluser
userdb
[root@host51 opt]# ls coluser/userdb/
coluser.bson  coluser.metadata.json
[root@host51 opt]# bsondump coluser/userdb/coluser.bson
{"_id":{"$oid":"5b617821e4ffddd428c72ab2"},"name":"yaya","password":"x","uid":1,"gid":1,"comment":"","homedir":"/home/yaya","shell":"/bin/bash"}
{"_id":{"$oid":"5b617821e4ffddd428c72ab3"},"name":"root","password":"x","uid":0,"gid":0,"comment":"root","homedir":"/root","shell":"/bin/bash"}
..............

4-2、数据恢复

• 语法格式
– mongorestore --host IP地址 --port 端口 -d 数据库名 [ -c 集合名 ] 备份目录名-----恢复时的库名和集合名可以自己随便创建
[root@host51 opt]# mongorestore --host 192.168.4.51 --port 27051 -d user -c userinfo coluser/userdb/coluser.bson
2018-08-01T17:40:47.641+0800    checking for collection data in coluser/userdb/coluser.bson
2018-08-01T17:40:47.642+0800    reading metadata for user.userinfo from coluser/userdb/coluser.metadata.json
2018-08-01T17:40:47.744+0800    restoring user.userinfo from coluser/userdb/coluser.bson
2018-08-01T17:40:47.806+0800    no indexes to restore
2018-08-01T17:40:47.806+0800    finished restoring user.userinfo (43 documents)
2018-08-01T17:40:47.806+0800    done
[root@host51 opt]# mongo --host 192.168.4.51 --port 27051
> use user
switched to db user
> show tables
userinfo
> db.userinfo.find()
{ "_id" : ObjectId("5b617821e4ffddd428c72ab2"), "name" : "yaya", "password" : "x", "uid" : 1, "gid" : 1, "comment" : "", "homedir" : "/home/yaya", "shell" : "/bin/bash" }
{ "_id" : ObjectId("5b617821e4ffddd428c72ab3"), "name" : "root", "password" : "x", "uid" : 0, "gid" : 0, "comment" : "root", "homedir" : "/root", "shell" : "/bin/bash" }
.............
 
 
 
 
 


 

猜你喜欢

转载自blog.csdn.net/Perfect11_1/article/details/81335851
今日推荐