MongoDB:NoSQL(非关系型)
应用场景:几乎所有场景都可以应用MongoDB,比如:视频类、游戏类、电商类应用
1、各种应用服务的日志存储,MongoDB的高性能足够支撑关系型数据库2-3倍以上的TPS(事务处理速率)/QPS(请求速率),同时自带的三种压缩格式方便在容量和性能直接作出选择,通过MongoDB存储日志文件,查询简单(索引),写入导出方便(弹性结构没有表结构限制,例如:第一行5列,第二行可以是3列)。
2、敏捷开发,如果想快速构建应用系统,同时还想拥有高性能,高灵活性的schema,用MongoDB吧。
3、地理位置信息存储,通过2d和2dsphere索引,可以方便的查询出具体的位置信息。
4、json存储,json的数据结构简单、直观,非常适合用来表达数据,且易于阅读、扩展。(json就是键值对的,例如:elk的日志格式)
主要特性
1、事务支持 MongoDB 目前只支持单文档事务,需要复杂事务支持的场景暂时不适合。
PS:4.0版本已经GA,已经支持ACID事务。
2、灵活的文档模型,JSON 格式存储最接近真实对象模型,对开发者友好,方便快速开发迭代。
3、高可用复制集,满足数据高可靠、服务高可用的需求,运维简单,故障自动切换。
4、可扩展分片集群,海量数据存储,服务能力水平扩展。
5、高性能,mmapv1、wiredtiger、mongorocks(rocksdb)、in-memory 等多引擎支持满足各种场景需求。
6、强大的索引支持 地理位置索引可用于构建 各种 O2O 应用、文本索引解决搜索的需求、TTL索引解决历史数据自动过期的需求。(索引自动建立)
7、Gridfs,解决文件存储的需求。(例如:分表)
8、aggregation & mapreduce,(映射简约),解决数据分析场景需求,用户可以自己写查询语句或脚本,将请求都分发到 MongoDB 上完成。(大数据分析)
逻辑结构
MySQL逻辑结构
库
表
数据行
Mongodb 逻辑结构
库database
集合(collection)(表)
文档(document)(行)
实验环境
实验步骤
1、关闭大页内存机制(变成默认的16K)
永久关闭:
vim /etc/rc.local
添加:
if test -f /sys/kernel/mm/transparent_hugepage/enabled; then
echo never > /sys/kernel/mm/transparent_hugepage/enabled
fi
if test -f /sys/kernel/mm/transparent_hugepage/defrag; then
echo never > /sys/kernel/mm/transparent_hugepage/defrag
fi
临时关闭:
echo never > /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/defrag
2、修改最大文件数
查看最大文件数
ulimit -n
修改最大连接数为65535
vim /etc/security/limits.conf
添加:
* soft nofile 65535
* hard nofile 65535
vim /etc/pam.d/login
添加:
session required /lib/security/pam_limits.so
重启
shutdown -r now
ulimit -n
3、创建所需用户和组
useradd mongod
4、创建mongodb所需目录
mkdir -p /mongodb/{conf,log,data}
5、安装mongodb
将mongodb-linux-x86_64-rhel70-4.4.4.tgz包拖入/root目录
tar xf mongodb-linux-x86_64-rhel70-4.4.4.tgz
cp -a mongodb-linux-x86_64-rhel70-4.4.4/bin/ /mongodb/
6、设置目录权限
chown -R mongod:mongod /mongodb/
7、使用mongodb用户登录并设置环境变量
降级启动
su – mongod
vim .bash_profile
添加:
export PATH=/mongodb/bin:$PATH
source .bash_profile
8、启动mongodb
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork
netstat -anpt | grep mongo
9、登录mongodb
mongo
执行简单语句测试:
show databases
use local
show tables
10、使用配置文件启动mongodb
关闭mongodb
mongod --dbpath=/mongodb/data --logpath=/mongodb/log/mongodb.log --port=27017 --logappend --fork --shutdown
创建配置文件
vim /mongodb/conf/mongodb.conf
添加:
logpath=/mongodb/log/mongodb.log
dbpath=/mongodb/data
port=27017
logappend=true
fork=true
启动mongodb
mongod -f /mongodb/conf/mongodb.conf
关闭mongodb
mongod -f /mongodb/conf/mongodb.conf --shutdown
11、使用YAML文件启动mongodb
修改配置文件
vim /mongodb/conf/mongodb.conf
添加:
systemLog:
destination: file
path: "/mongodb/log/mongodb.log"
logAppend: true
storage:
journal:
enabled: true
dbPath: "/mongodb/data/"
processManagement:
fork: true
net:
port: 27017
bindIp: 192.168.8.5,127.0.0.1
启动mongodb
mongod -f /mongodb/conf/mongodb.conf
关闭mongodb方式
mongod -f /mongodb/conf/mongodb.conf --shutdown
mongodb常用基本操作
- mongodb默认存在的库
show databases
- 命令种类
数据库对象(库(database),表(collection),行(document))
db.命令:
DB级别命令
db 当前在的库
db.[TAB] 类似于linux中的tab功能
db.help() db级别的命令使用帮助
collection级别操作:
db.Collection_name.xxx
document级别操作:
db.t1.insert()
复制集有关(replication set):
rs.
分片集群(sharding cluster)
sh.
- 帮助
help
KEYWORDS.help()
KEYWORDS.[TAB]
show
use
db.help()
db.a.help()
rs.help()
sh.help()
- 常用操作
查看当前db版本
db.version()
显示当前数据库
db
或
db.getName()
查询所有数据库
show dbs
注意:可以use到任何一个不存在的数据库里面,如果在这个不存在的数据库中存放数据,这个库就会自动创建
切换数据库
use local
查看所有的collection
show tables
显示当前数据库状态
db.stats()
查看当前数据库的连接机器地址
db.getMongo()
指定数据库进行连接
默认连接本机test数据库
- mongodb对象操作
mongo mysql
库 -----> 库
集合 -----> 表
文档 -----> 数据行
1、库的操作
创建数据库
当use的时候,系统就会自动创建一个数据库,如果use之后没有创建任何集合,系统就会删除这个数据库。
删除数据库
如果没有选择任何数据库,会删除默认的test数据库
删除test数据库
show dbs
2、集合的操作
创建集合格式:db.createCollection(name, options)
参数说明:
name: 要创建的集合名称
options: 可选参数, 指定有关内存大小及索引的选项
capped值为true,则创建固定集合
autoIndexId 值为true,自动在 _id 字段创建索引
size 为固定集合指定一个最大值(以字节计)
max 指定固定集合中包含文档的最大数量
方法1:
use app
db.createCollection('a')
db.createCollection('b')
查看当前数据下的所有集合
show collections
或
db.getCollectionNames()
方法2:
当插入一个文档的时候,一个集合就会自动创建
use hehe
db.haha.insert({id : "1021" ,name : "zhssn" ,age : "22" ,gender : "female",address : "sz"})
db.haha.insert({id : "101" ,name : "zhangsan" ,age : "18" ,gender : "male"})
查询数据
db.haha.find()
/ObjectId("677cb502871c022a3c9614f0"):默认创建了索引列
列出指定行
db.haha.find({id:"101"}).pretty()
列出所有行
db.haha.find().pretty()
删除集合
db.a.drop()
重命名集合
把b改名为log
db.b.renameCollection("log")
批量插入数据
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mysql","age":6,"date":new
Date()})}
数据查询语句
查询集合中的记录数
db.log.find() 查询所有记录
注:默认每页显示20条记录,当显示不下的的情况下,可以用it迭代命令查询下一页数据。
设置每页显示数据的大小
DBQuery.shellBatchSize=50 每页显示50条记录
db.log.findOne() 查看第一条记录
db.log.count() 查询总的记录数
删除集合中的记录数
db.log.deleteOne({"uid":0}) 删除满足条件的文档
db.log.remove({}) 删除集合中所有记录
for(i=0;i<10000;i++){db.log.insert({"uid":i,"name":"mysql","age":6,"date":new
Date()})}
db.log.distinct("name") 查询去掉当前集合中莫列的重复数据
查看集合存储信息
db.log.stats() 查看集合的状态
db.log.dataSize() 查看集合中数据的原始大小
db.log.totalIndexSize() 查看集合中索引数据的原始大小
db.log.storageSize() 查看集合中数据压缩存储的大小
db.log.totalSize() 查看集合中索引+数据压缩存储之后的大小
3、扩展集合文档命令
(1)创建固定集合 mycol,整个集合空间大小 6142800 KB, 文档最大个数为 10000 个
db.createCollection("mycol",{ capped : true, autoIndexId : true, size : 6142800, max : 10000 })
(2)变量插入数据
创建col集合
db.col.insert({title: 'MongoDB',
description: 'Nosql数据库',
by: '教程',
url: 'http://www.test.com',
tags: ['mongodb','database','NoSQL'],
likes: 100
})
show tables
db.col.find()
定义为一个变量,再插入数据
document=({title: 'MongoDB',
description: 'Nosql数据库',
by: '教程',
url: 'http://www.test.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
});
db.col.insert(document)
db.col.find()
(3)单、多行数据插入
语法:
db.collection.insertOne(): 向指定集合中插入一条文档数据
db.collection.insertMany(): 向指定集合中插入多条文档数据
插入单条数据
var document = db.collection.insertOne({"a": 3})
document
插入多条数据
var res = db.collection.insertMany([{"b": 3}, {'c': 4}])
res
(4)更新文档
集合 col 中插入如下数据
db.col.find()
如果没有两条数据则执行下面语句插入数据,做测试表
db.col.insert({
title: 'MongoDB',
description: 'Nosql数据库',
by: '教程',
url: 'http://www.test.com',
tags: ['mongodb', 'database', 'NoSQL'],
likes: 100
})
update() 方法来更新标题(title)
db.col.update({'title':'MongoDB'},{$set:{'title':'MongoDB 教程'}})
查看更新结果
db.col.find().pretty()
以上update语句只会修改第一条发现的文档,修改多条需要设置 multi 参数为 true
db.col.update({'title':'MongoDB'},{$set:{'title':'MongoDB教程'}},{multi:true})
db.col.find().pretty()
(5)删除行
db.collection.find()
推荐使用 deleteOne() 和 deleteMany()
删除匹配条件一个文档
db.collection.deleteOne({"c":4})
删除匹配条件所有文档
db.collection.deleteMany({"b":3})
db.collection.find()