MongoDB详解

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 忽略标题

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值