优势:能够长期保存 能存储大量数据java
缺点:没有结构化的组织 查找不方便 数据容易冗余python
有文件存储的优势,同时解决了文件存储的问题mysql
缺点 : 操做难度较高linux
数据 --> 数据库 --> 数据库管理系统 --> 数据库系统c++
采用关系磨性来组织数据结构的数据库正则表达式
常见数据库形式有:Oracle DB2 SQLServer Mysql sqliteredis
优势:sql
(1)容易理解,使用方便,sql语句自己比较成熟,而关系型数据库大都采用sql作数据操做mongodb
(2)易于维护,完整性好,数据一致性高shell
(3)通用化程度高,技术成熟,可使用外链等操做
缺点:
(1)没法很好知足高并发需求,每次数据操做都须要解析sql语句,致使读写能力降低(通常该类型数据库都是用C / C++语言编写的,输入时采用sql语句,须要编译)
(3)针对海量数据的爆发处理能力不足,每次操做都要上锁
(4)扩展性不足
优势:
(1)能够知足高并发需求,读写能力强
(2)支持分布式部署
(3)弱化了数据结构,下降了数据的一致性
缺点:
(1)发展比较晚,技术尚不成熟,好比缺乏join等复杂性操做,通用性差,没有sql这样的语句
(2)结构灵活,灵活则会致使混乱,写法复杂
非关系性数据库(Nosql)适用那些状况
(1)数据磨性结构简单
(2)对数据的一致性要求低
(3)对数据的并发处理要求高
(4)对数据的扩展性有要求
非关系型数据库Nosql分类
(1)键值类数据库:
redis oracle DBD tokyo
如:name:张三
(2)列存储:
HBase
(3)文档型数据库:
MongDB
{ name:张三, sex:男}
(4)图形数据库
(1)非关系型 文档型
(2)C++ 编写,支持分布式
(3)数据格式为bson类型,bson格式是jion的升级版,他丰富了json的数据类型
(4)功能比较前面
(5)支持众多编程语言接口 python ruby C# C++ PHP
自动安装
在Linux系统中的安装步骤
(1)sudo apt -get update
(2)sudo apt -get install mongodb
默认安装目录:/var/lib/mongodb
配置文件:
/etc/mongodb.conf
/usr/bin
手动安装
(1)www.mongodb.com 下载安装包
(2)在目录下解压 /usr/local/opt
(3)解压后将文件夹中bin目录添加到环境变量中
export PATH = $PATH:/usr...
在linux终端上输入mongo能够启动mongo shell
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test
该模式下支持简单的语法
quit() 退出 mongo shell
mongod
--dbpath:指定数据目录,每一个mongod进程都须要独立的数据目录,若是要是有3哥mongod实例,则必须有3个独立的数据目录;当mongod启动时,会在数据库目录中建立mongod.lock文件,这个文件用于防止其余的mongod纯净使用该数据目录
--port:指定服务器监听的端口号,默认端口号为27017,要运行多个mongo进程,则要给每一个指定不一样的端口号。
--logpath:指定日志的输出路径,若是对文件夹有读写权限,系统会在文件不存在时建立它,它会将已有文件覆盖掉;
--logappend:同logpath,但该选项可不会将原有文件覆盖,而是保留原来的日志
--config:指定配置文件,加载命令行未指定的各类选项
为了对比,现将关系型数据库mysql与mongo进行对比
(1)MySQL与mongo基本含义对比
MySQL mongo 含义
database database 数据库
table collection 表/集合
column field 字段/域
row document 记录/文档(每一条信息称之为文档)
index index 索引
(2)数据形式对比
MySQL数据(表)结构形式
---------------------------
id | name | age
---------------------------
1 | Lily | 10
---------------------------
2 | Lucy | 11
---------------------------
mongo数据结构(字典)
{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lily',
'age': 10
},
{
'_id':ObjectId("xxxxxxxxxxxxxxxxxxx"),
'name': 'Lucy',
'age': 11
}
建立数据库:use dbname(dbname为数据库名)
注:
(1)use为选择使用的数据库,若是数据库不存在,则插入数据时会自动建立该数据库
实例:
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test > use dbname switched to db dbname > # use 并非直接将数据库建立起来,主要仍是选择这个数据,只有真正建立这个表时,才是真正建立这个数据库 > show dbs admin (empty) local 0.078GB mongo_test 0.078GB > # 此时并无显示dbname数据库,因里面并无数据
(2)db(全局变量)表示当前正在使用的数据库,若是没有use选用目标数据库,则默认使用一个叫test的数据库
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test > db test > use dbname switched to db dbname > db dbname
数据库的命名规则和特色
(1)数据库支持格式为utf-8
(2)数据库区分大小写,原则上都是小写;sql语句则不区分大小写
(3)命名也能够是utf-8格式,但不能是空字符串
(4)数据库名不能含有:空格、点、/ \ '\0'
(5)不能超过64字节
(6)数据库避免与诸如admin、local、config等数据库关键字冲突
注:admin(存储用户权限)、local(存储不想被分享复制的数据)、config(当分布式操做时才会出现,表示分片处理信息)
备份:
mongodump -h dbhost -d dbname -o dbdir
主机 数据库 文件夹
tarena@tedu:~$ mongodump -h 127.0.0.1 -d stu -o dbstudent connected to: 127.0.0.1 2018-05-08T22:28:06.022+0800 DATABASE: stu to dbstudent/stu
...
查找是否已经备份成功
tarena@tedu:~$ ls AID1709.csv dbstudent PycharmProjects 视频 下载 anaconda3 examples.desktop 公共的 图片 音乐 core java_error_in_PYCHARM_.log 模板 文档 桌面 tarena@tedu:~$ ls dbstudent/ stu
恢复数据
mongorestore -h dbhost -d dbname <path>
主机 将数据回复到那个数据库 要恢复数据库文件夹
tarena@tedu:~$ mongorestore -h 127.0.0.1:27017 -d student student/stu connected to: 127.0.0.1:27017 ...
db.dropDatebase()
功能:删除当前数据库
tarena@tedu:~$ mongostat connected to: 127.0.0.1 insert query update delete getmore command flushes mapped vsize res faults locked db idx miss % qr|qw ar|aw netIn netOut conn time *0 *0 *0 *0 0 1|0 0 640m 1.47g 35m 1 test:0.0% 0 0|0 0|0 62b 4k 1 22:40:13 *0 *0 *0 *0 0 1|0 0 640m 1.47g 35m 0 test:0.0% 0 0|0 0|0 62b 4k 1 22:40:14
具体截图
备注:insert (每秒的插入次数) query(每秒的查询次数) update(更新次数) delete(删除次数 )
mongotop 监测数据库的读写时长
tarena@tedu:~$ mongotop connected to: 127.0.0.1 ns total read write 2018-05-08T14:48:20 grid.system.namespaces 0ms 0ms 0ms grid.system.indexes 0ms 0ms 0ms grid.fs.files 0ms 0ms 0ms grid.fs.chunks 0ms 0ms 0ms grade.system.namespaces 0ms 0ms 0ms grade.system.indexes 0ms 0ms 0ms grade.class 0ms 0ms 0ms
截图显示
查看方式:show dbs
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test > show dbs admin (empty) dbname 0.078GB local 0.078GB mongo_test 0.078GB > use stu switched to db stu > db.createCollection('class0') { "ok" : 1 } > db.createCollection('class0') { "ok" : 0, "errmsg" : "collection already exists" }
db.createCollection(collection_name)
功能:建立一个集合
参数:集合的名称
注:至关于 sql 语句中的表
(1)集合名不能以system . 开头,它是系统集合保留的前缀
(2)集合名称不要和关键字重名,不要带有$
(3)集合名能含有 ‘\0'
(4)集合也是utf-8字符串
db.collection_name.insert()
collection_name:集合名
当插入数据时,若是集合不存在则会自动建立;此也意味着,若将集合名称写错时也会建立新的集合并插入数据
tarena@tedu:~$ mongo MongoDB shell version: 2.6.10 connecting to: test > show collections class3 system.indexes > show tables class3 system.indexes >
show collections 和 show tables 能够达到相同效果
db.createCollection(collection_name)
功能:建立一个集合
参数:集合的名称
命名规则:
(1)集合也是utf-8 字符串
(2)不能含有'\0',由于最终是用c++来解析的,当存在'\0'时,c++就会默认为这是结束的
(3)不能以system.开头,他是系统集合的保留前缀
(4)集合名称不要和关键字重名 ,不要带有$,mongdb中好多关键字是有$引入的,也即,集合名称不要额操做符重名
db.collection_name.insert()
当插入数据时,集合不存在时则会自动建立
若是将集合名称写错时,也会建立新的集合并插入数据
删除指定的集合:db.collecton_name.drop()
> show collections abc class0 class1 system.indexes > db.abc.drop() true > show collections class0 class1 system.indexes
db.collection_name.renameCollection(new_name)
参数:新的集合名称
> show collections class0 class1 system.indexes > db.class1.renameCollection('cls') { "ok" : 1 } > show collections class0 cls system.indexes >
在形式上相似于python中的字典,每一个文档内部由 0个 或 多个 键值对构成,但文档不一样于字典的是,文档是有序的。
bson:{'name':'licy','age':18}
键的命名规则:
(1)键值均为uft-8类型字符串,因此做为键时,加不加都可
> db.class0.insert({'name':'李四' ,age:19,}) WriteResult({ "nInserted" : 1 }) > db.class0.find() { "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : 19 } >
(2)不能有‘\0',通常不会以点.和 $ 开头,也不使用下划线_开头
(3)键不能重复
文档中的值:
指的是mongo数据库支持的数据类型
mongo支持的数据类型:
字符串 utf-8字符串均为合法字符串
整型 32位 和64位
布尔类型 true false 或者1 0来表示也能够
浮点型 小数
Arrays 用来存储数组胡列表
Timestamp 时间戳,存储时间节点
Date 时间类型,年月日时分秒
Symbol 字符串类型 一般用来存储特殊字符
Null null类型 表示空
object 文档类型(一般用于内部文件)
Binary data 二进制数据
code 代码 js
regex 正则表达式
ObjectId 系统自动生成的ID对象
在一个集合中文档的域不必定相同,也就是说键值对不必定彻底相同
在一个文档中尽可能选择意义相同的文档放入统一集合中
db.collection.insert()
例如
> db.class0.insert({'name':'李四' ,age:19,}) WriteResult({ "nInserted" : 1 }) > db.class0.find() { "_id" : ObjectId("5abf2fe426803c9f334a1019"), "name" : "李四", "age" : 19 } >
ObjectId("5abf2fe426803c9f334a1019")
_id:是系统自动提供的主键,
5abf2fe4 26803c 9f33 4a1019 24位16进制
文档建立时间 机器ID 进程ID 计数器
插入多条文档
insert([{},{},{}])
db.class0.insert([{'name':'王五',age:18,sex:'女'},{name:'张三',age:19,sex:'女'}])
insert() 插入数据时,也能够采用_id 来自定义插入id值,但id值不能重复。
db.collection.save()
实例
db.class0.save({_id:2,name:'娄拉',age:22,sex:'女'})
注:
(1)当插入键值对中没有_id 域时,同insert
(2)当插入键值对有_id值,则会将拟插入的_id值与已插入的_id值进行匹配,若是匹配到已经插入的值,则会对相应文档进行修改,若是没有匹配到则其功能至关于insert(),将会插入到数据库中
(3)save() 没法插入多条数据
db.collection.find(query, field)
功能:查找文档
参数:
query 查找条件 {name:'张三'}
field 显示的域 {_id:0}
返回值:返回查找到的文档(返回第一条,先进先出,查找的第一条,也即先输入的第一条)
field的值的表示方式:{field:0|1}
0:表示不显示该域
1:表示显示该域
注:
(1)若将某个域设置为1,则表示其余域均为0
(2)若将某个域设置为0,则表示其余域均为1
(3)不容许同时设置1和 0
(4)_id 永远默认为1,也可将其设置为0
db.collection.findOne(query, field)
功能:只查找第一条符合查找条件的数据
参数:同find同样
返回值:返回第一条匹配到的文档
db.getCollection('class0') == db.class0
= > < >= <= !=
$eq 等于
计算 age=20 的记录
db.class0.find({age:{$eq:20}},{_id:0})
$lt 小于
$lte 小于等于
$gt 大于
$gte 大于等于
$ne 不等于
例如:
db.class0.find({age:{$gte:19,$lte:21}},{_id:0})
$in 包含
db.class0.find({age:{$in:[17,18,19]}},{_id:0})
$nin 不包含
db.class0.find({age:{$nin:[18,21]}},{_id:0})
and or not
$and 逻辑与
db.class0.find({$and:[{name:'张三'},{age:19}]},{_id:0})
注:query 中逗号分割的多个条件默认就是and关系
$or 逻辑或
db.class0.find({$or:[{age:{$lt:19}},{age:{$gt:21}}]},{_id:0})
$not 逻辑非
db.class0.find({age:{$not:{$gt:20}}},{_id:0})
$nor 既不是也不是
db.class0.find({$nor:[{age:{$gt:20}},{sex:'男'}]},{_id:0})
age > 21 or (namg = 张三 and sex != 女) db.class0.find({$or:[{age:{$gt:21}},{name:'张三',sex:{$not:{$eq:'女'}}}]},{_id:0}) db.class0.find({$or:[{age:{$gt:21}},{name:'张三',sex:{$nin:['女']}}]},{_id:0})