MongoDB介绍
介于关系数据库和非关系数据库之间的产品
–一款基于分布式文件存储的数据库,旨在为WEB应用提供可扩展的高性能数据存储解决方案
– 将数据存储为一个文档(类似与JSON对象),数据结构有键值(key=value)对组成,用硬盘存储数据
–支持丰富的查询表达,可以设置任何属性的索引
–支持副本集,分片
一 搭建MDB服务器
1 解包:
[root@mysql50 ~]# tar -xf mongodb-linux-x86_64-rhel70-3.6.3.tgz
[root@mysql50 ~]# cd mongodb-linux-x86_64-rhel70-3.6.3/
2 自定义配置文件主目录
[root@mysql50 mongodb-linux-x86_64-rhel70-3.6.3]# mkdir /etc/mongodb
3 将bin目录下的所有可执行文件拷贝到配置文件主目录
[root@mysql50 mongodb-linux-x86_64-rhel70-3.6.3]# cp -r bin /etc/mongodb
[root@mysql50 mongodb-linux-x86_64-rhel70-3.6.3]# cd /etc/mongodb
[root@mysql50 mongodb]# ls
bin
4 创建配置文件目录
[root@mysql50 mongodb]# mkdir etc
5 创建日志文件目录
[root@mysql50 mongodb]# mkdir log
6 创建数据库文件目录
[root@mysql50 mongodb]# mkdir -p data/db
[root@mysql50 mongodb]# ls
bin data etc log
7 编辑配置文件,指定启动程序时的选项
[root@mysql50 mongodb]# vim etc/mongodb.conf
logpath=/etc/mongodb/log/mongodb.log //指定日志文件目录
logappend=true //日志信息以追加的形式记录
dbpath=/etc/mongodb/data/db // 指定数据库文件目录
fork=true //以守护进程方式运行
[root@mysql50 mongodb]# ls bin
bsondump install_compass mongo mongod mongodump mongoexport mongofiles mongoimport mongoperf mongoreplay mongorestore mongos mongostat mongotop
8 启动程序
[root@mysql50 mongodb]# ./bin/mongod -f /etc/mongodb/etc/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 10783
child process started successfully, parent exiting
[root@mysql50 mongodb]# ss -antulp | grep 27017
tcp LISTEN 0 128 127.0.0.1:27017 *:* users:(("mongod",pid=10783,fd=11)) //默认本机127.0.0.1自己访问Mongodb服务,端口号为27017
[root@mysql50 mongodb]# ps -C mongod
PID TTY TIME CMD
10783 ? 00:00:00 mongod
9 连接进入数据库
[root@mysql50 mongodb]# ./bin/mongo
MongoDB shell version v3.6.3
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.6.3
> exit
10 当进入连接数据库后,会在数据库文件目录下生成各种数据库文件
[root@mysql50 mongodb]# ls data/db
collection-0-3982340097697421615.wt index-1-3982340097697421615.wt _mdb_catalog.wt storage.bson WiredTiger.lock
collection-2-3982340097697421615.wt index-3-3982340097697421615.wt mongod.lock WiredTiger WiredTiger.turtle
diagnostic.data journal
11 当进入连接数据库后,在日志文件里会记录启动服务以及连接数据库相关的日志信息
[root@mysql50 mongodb]# cat log/mongodb.log
2018-12-04T14:34:28.493+0800 I CONTROL [initandlisten] MongoDB starting : pid=10783 port=27017 dbpath=/etc/mongodb/data/db 64-bit host=mysql50
2018-12-04T14:34:28.493+0800 I CONTROL [initandlisten] db version v3.6.3
2018-12-04T14:34:28.493+0800 I CONTROL [initandlisten] git version: 9586e557d54ef70f9ca4b43c26892cd55257e1a5
2018-12-04T14:34:28.493+0800 I CONTROL [initandlisten] OpenSSL version: OpenSSL 1.0.1e-fips 11 Feb 2013
2018-12-04T14:34:28.493+0800 I CONTROL [initandlisten] allocator: tcmalloc
12 停止mongodb服务
[root@mysql50 mongodb]# ./bin/mongod -f /etc/mongodb/etc/mongodb.conf --shutdown
killing process with pid: 10783
13 修改配置文件的IP地址和端口号
[root@mysql50 mongodb]# vim etc/mongodb.conf
bind_ip=192.168.4.50
port=27050
logpath=/etc/mongodb/log/mongodb.log
logappend=true
dbpath=/etc/mongodb/data/db
fork=true
14 启动mongodb服务
[root@mysql50 mongodb]# ./bin/mongod -f /etc/mongodb/etc/mongodb.conf
about to fork child process, waiting until server is ready for connections.
forked process: 11197
child process started successfully, parent exiting
[root@mysql50 mongodb]# ss -antulp | grep 27050
tcp LISTEN 0 128 192.168.4.50:27050
15 再次登录连接数据库:
[root@mysql50 bin]# ./mongo --host 192.168.4.50 --port 27050
MongoDB shell version v3.6.3
connecting to: mongodb://192.168.4.50:27050/
MongoDB server version: 3.6.3
16 为启动服务,关闭服务,连接数据库定义别名
[root@mysql50 mongodb]# vim /root/.bashrc
alias lmdb='/etc/mongodb/bin/mongo --host 192.168.4.50 --port 27050'
alias mstart='/etc/mongodb/bin/mongod -f /etc/mongodb/etc/mongodb.conf'
alias mstop='/etc/mongodb/bin/mongod -f /etc/mongodb/etc/mongodb.conf --shutdown'
[root@mysql50 mongodb]# source /root/.bashrc //读取配置文件,别名立即生效
二 MongoDB常用操作(注意: MongDB数据库严格区分大小写)
1 库管理
1) 查看已有的库
> show dbs
admin 0.000GB
config 0.000GB
db1 0.000GB
local 0.000GB
2)切换库,若库不存在则自动创建:
> use db1
switched to db db1
3) 显示当前所在库
> db
db1
4 )查看库下已有集合
> show collections
或者
> show tables
5 )删除当前所在库
> db.dropDatabase()
6 )数据库名称规范
–不能是空字符串(“”)
–不得含有‘’ (空格) . $ / \ \0 (空字符)
–应全部小写
–最多64字节
2 集合管理
1)查看集合
> show tables
2)创建集合,集合不存在时,自动创建并添加文档
> db.t1.save({name:"tom",age:21,sex:"boby"})
WriteResult({ "nInserted" : 1 })
3)删除集合
> db.t1.drop()
true
4)集合命名的规范:
–不能是空字符串“”
–不能含有\0字符(空字符),此字符表示集合的结尾
–不能以“system."开头,这是为系统集合保留的q前缀
–用户创建的集合名字不能能含有保留字
5)插入数据:
> db.t1.insert({mail:"12@qq.com",school:"jfeng",city:"beijing"})
WriteResult({ "nInserted" : 1 })
6)查看文档:
> db.t1.find()
{ "_id" : ObjectId("5c06378fe5a0acdc97a6ce27"), "name" : "tom", "age" : 21, "sex" : "boby" }
{ "_id" : ObjectId("5c0637bae5a0acdc97a6ce28"), "mail" : "12@qq.com", "school" : "jfeng", "city" : "beijing" }
7)统计文档数量:
> db.t1.count()
2
8)按条件查询:
> db.t1.find({name:"tom"})
{ "_id" : ObjectId("5c06378fe5a0acdc97a6ce27"), "name" : "tom", "age" : 21, "sex" : "boby" }
9)返回第一条文档:
> db.t1.findOne()
{
"_id" : ObjectId("5c06378fe5a0acdc97a6ce27"),
"name" : "tom",
"age" : 21,
"sex" : "boby"
}
10)删除匹配的所有文档:
> db.t1.remove({mail : "12@qq.com"})
WriteResult({ "nRemoved" : 2 })
11)删除所有的文档:
> db.t1.remove({})
WriteResult({ "nRemoved" : 1 })
3 基本数据类型:
1)字符串string ,UTF-8字符串都可以表示为字符串类型的数据
> db.t2.save({name:"张三",性别:"girl"})
WriteResult({ "nInserted" : 1 })
2)布尔值bool,布尔类型有两个值true和flase
> db.t2.save({name:"张三",婚姻:"flase"})
WriteResult({ "nInserted" : 1 }
3)空null ,用于表示控值或者不存在的字段
> db.t2.save({name:"张三",存款:null})
WriteResult({ "nInserted" : 1 })
4)数值/数组array
数值:
–shell 默认使用64位浮点型数值。{x:3.14}或{x:3}
–NumberInt (4字节整数) {x:NumberInt(3)} //可以赋值为浮点数,默认保存整数部分)
–NumberLong (8字节整数) {x:NumberLOng(3)} //赋值时必须为整数,否则报错
> db.t2.save({name:"张三",age:22})
WriteResult({ "nInserted" : 1 })
> db.t2.save({name:"张三",age:22.5})
WriteResult({ "nInserted" : 1 })
> db.t2.save({name:"张三",pay:NumberInt(3388.88)}) //只保存整数位
WriteResult({ "nInserted" : 1 })
> db.t2.save({name:"张三",pay:NumberLong(3388.88)})
2018-12-04T17:04:12.940+0800 E QUERY [thread1] Error: number passed to NumberLong must be representable as an int64_t : //报错
@(shell):1:27
> db.t2.save({name:"张三",pay:NumberLong(3388)})
WriteResult({ "nInserted" : 1 })
数组array
–数据列表或数据集可以表示为数组
–{x:[“a”,“b”,“c”]}
> db.t2.save({name:"张三",爱好:["吃","喝","玩","乐"]})
WriteResult({ "nInserted" : 1 })
> db.t2.find()
{ "_id" : ObjectId("5c0643b9e5a0acdc97a6ce31"), "name" : "张三", "爱好" : [ "吃", "喝", "玩", "乐" ] }
代码/日期/对象
代码
–查询和文档中可以包含任何javascript代码
–{x:function(){/* 代码 */}}
> db.t2.save({name:"张三",code:function(){/* <??php echo "hello world" ?>*/}})
日期
–日期被存储为自新纪元依赖经过的毫秒数,不含时区
–{x:new Date()}
> db.t2.save({name:"张三",day:new Date()})
WriteResult({ "nInserted" : 1 })
> db.t2.find()
{ "_id" : ObjectId("5c064595e5a0acdc97a6ce33"), "name" : "张三", "day" : ISODate("2018-12-04T09:15:01.548Z") }
对象 ,在插入文档时,数据库会自动为每一条文档生成一个object id
–对象id是一个12字节的字符除啊,是文档的唯一标识
–{x:ObjectId()}
内嵌/正则表达式
内嵌:
–文档可以嵌套其他文档,被嵌套的文档作为值来处理
> db.t2.save({book:{name:"ywzd",auth:"dmy",pay:25,ver:3}})
WriteResult({ "nInserted" : 1 })
正则表达式:
–查询时,使用正则表达式作为限定条件
> db.t2.save({name:"lily",re:/^$/})
WriteResult({ "nInserted" : 1 })
三 数据的导入和导出
1 数据导出:
json格式
[root@mysql50 bin]# /etc/mongodb/bin/mongoexport --host 192.168.4.50 --port 27050 \
> -d db1 -c t2 --type=json >/mdb/t1.json
2018-12-04T17:42:36.971+0800 connected to: 192.168.4.50:27050
2018-12-04T17:42:36.972+0800 exported 12 records
查看到导出来的数据
[root@mysql50 bin]# cat /mdb/t1.json
{"_id":{"$oid":"5c063fe8e5a0acdc97a6ce2a"},"name":"张三","性别":"girl"}
{"_id":{"$oid":"5c06404fe5a0acdc97a6ce2b"},"name":"张三","婚姻":"flase"}
{"_id":{"$oid":"5c064094e5a0acdc97a6ce2c"},"name":"张三","存款":null}
{"_id":{"$oid":"5c064296e5a0acdc97a6ce2d"},"name":"张三","age":22.0}
{"_id":{"$oid":"5c0642b3e5a0acdc97a6ce2e"},"name":"张三","age":22.5}
{"_id":{"$oid":"5c064300e5a0acdc97a6ce2f"},"name":"张三","pay":3388}
{"_id":{"$oid":"5c064355e5a0acdc97a6ce30"},"name":"张三","pay":{"$numberLong":"3388"}}
{"_id":{"$oid":"5c0643b9e5a0acdc97a6ce31"},"name":"张三","爱好":["吃","喝","玩","乐"]}
{"_id":{"$oid":"5c0644c6e5a0acdc97a6ce32"},"name":"张三","code":{"$code":"function (){/* \u003c??php echo \"hello world\" ?\u003e*/}"}}
{"_id":{"$oid":"5c064595e5a0acdc97a6ce33"},"name":"张三","day":{"$date":"2018-12-04T09:15:01.548Z"}}
{"_id":{"$oid":"5c0648dae5a0acdc97a6ce34"},"book":{"name":"ywzd","auth":"dmy","pay":25.0,"ver":3.0}}
{"_id":{"$oid":"5c06497fe5a0acdc97a6ce35"},"name":"lily","re":{"$regex":"^$","$options":""}}
csv格式:(注意,此格式必须要指定字段名,否则报错)
[root@mysql50 bin]# /etc/mongodb/bin/mongoexport --host 192.168.4.50 --port 27050 -d db1 -c t2 -f name,age --type=csv >/mdb/t2.csv
2018-12-04T17:50:31.443+0800 connected to: 192.168.4.50:27050
2018-12-04T17:50:31.444+0800 exported 12 records
查看导出来的数据
[root@mysql50 bin]# cat /mdb/t2.csv
name,age
张三,
张三,
张三,
张三,22
张三,22.5
张三,
张三,
张三,
张三,
张三,
,
lily,
2 数据导入
导入json格式的数据 (数据导入时可以导入到不存在的库和集合,会自动创建)
[root@mysql50 bin]# /etc/mongodb/bin/mongoimport --host 192.168.4.50 --port 27050 -d db2 -c t1 --type=json /mdb/t1.json
2018-12-04T17:56:58.869+0800 connected to: 192.168.4.50:27050
2018-12-04T17:56:59.014+0800 imported 12 documents
> use db2
switched to db db2
> show tables
t1
> db.t1.find()
{ "_id" : ObjectId("5c063fe8e5a0acdc97a6ce2a"), "name" : "张三", "性别" : "girl" }
{ "_id" : ObjectId("5c06404fe5a0acdc97a6ce2b"), "name" : "张三", "婚姻" : "flase" }
{ "_id" : ObjectId("5c064094e5a0acdc97a6ce2c"), "name" : "张三", "存款" : null }
{ "_id" : ObjectId("5c064296e5a0acdc97a6ce2d"), "name" : "张三", "age" : 22 }
{ "_id" : ObjectId("5c0642b3e5a0acdc97a6ce2e"), "name" : "张三", "age" : 22.5 }
{ "_id" : ObjectId("5c064300e5a0acdc97a6ce2f"), "name" : "张三", "pay" : 3388 }
{ "_id" : ObjectId("5c064355e5a0acdc97a6ce30"), "name" : "张三", "pay" : NumberLong(3388) }
{ "_id" : ObjectId("5c0643b9e5a0acdc97a6ce31"), "name" : "张三", "爱好" : [ "吃", "喝", "玩", "乐" ] }
{ "_id" : ObjectId("5c0644c6e5a0acdc97a6ce32"), "name" : "张三", "code" : { "code" : "function (){/* <??php echo \"hello world\" ?>*/}" } }
{ "_id" : ObjectId("5c064595e5a0acdc97a6ce33"), "name" : "张三", "day" : ISODate("2018-12-04T09:15:01.548Z") }
{ "_id" : ObjectId("5c0648dae5a0acdc97a6ce34"), "book" : { "name" : "ywzd", "auth" : "dmy", "pay" : 25, "ver" : 3 } }
{ "_id" : ObjectId("5c06497fe5a0acdc97a6ce35"), "name" : "lily", "re" : /^$/ }
导入csv格式:
[root@mysql50 bin]# /etc/mongodb/bin/mongoimport --host 192.168.4.50 --port 27050 -d db3 -c t1 -f name,age --type=csv /mdb/t2.csv
2018-12-04T18:03:08.814+0800 connected to: 192.168.4.50:27050
2018-12-04T18:03:08.963+0800 imported 13 documents
–导入数据时,若库和集合不存在,则创建库和集合后在导入数据
–若库和集合已存在,则以追加的方式导入到数据库集合里
–使用–drop选项可以删除数据后导入新数据,–headlerine 忽略标题