MongoDB是一个基于分布式文件存储的数据库。
NoSQL简介
1. Not Only SQL,不仅仅是SQL:非关系型数据库
2. 关系数据库管理系统RDMBSs
3. 关系型数据库遵循ACID规则:
a) A (Atomicity) 原子性
b) C (Consistency) 一致性
c) I (Isolation) 独立性
d) D (Durability) 持久性
4. 事务 transaction
5. 分布式系统(distributed system)由多台计算机和通信的软件组件通过计算机网络连接(本地网络或广域网)组成。分布式系统是建立在网络之上的软件系统。正是因为软件的特性,所以分布式系统具有高度的内聚性和透明性。
因此,网络和分布式系统之间的区别更多的在于高层软件(特别是操作系统),而不是硬件。分布式系统可以应用在在不同的平台上如:Pc、工作站、局域网和广域网上等。
RDBMS vs NoSQL
RDBMS
- 高度组织化结构化数据
- 结构化查询语言(SQL) (SQL)
- 数据和关系都存储在单独的表中。
- 数据操纵语言,数据定义语言
- 严格的一致性
- 基础事务
NoSQL
- 代表着不仅仅是SQL
- 没有声明性查询语言
- 没有预定义的模式
-键 - 值对存储,列存储,文档存储,图形数据库
- 最终一致性,而非ACID属性
- 非结构化和不可预知的数据
- CAP定理
- 高性能,高可用性和可伸缩性
6. CAP定理(CAPtheorem)
a) 一致性(Consistency)所有节点再同一时间具有相同的数据
b) 可用性(Availiability)保证每个请求不管成功或者失败都有响应
c) 分隔容忍(Partitiontolerance)系统中任意信息的丢失或失败不会影响系统的继续运作。
7. BASE:Basically Available,Soft-state,EventuallyConsistent。
a) 基本可用
b) 软状态/柔性事务(无连接)
c) 最终一致性
MongoDB简介
1. 将数据存储为一个文档,数据结构由键值对组成(key=>value),类似于JSON对象,字段值可以包含其他文档,数组,及文档数组。
2. 主要特点:
a) 可在记录中设置任何属性的索引来实现更快排序
b) 扩展性
c) 分片
d) 更容易查询文档中内嵌的对象和数组
e) Update()可以实现替换完成的文档或者一些指定的数据字段
f) Map/reduce主要是用来对数据进行批量处理和聚合操作
g) Map函数调用emit(key,value)便利所有记录,将key,value传给Reduce进行处理
h) 可以通过db.runCommand或mapreduce命令来执行MapReduce操作
i) GridFS可以用于存放大量小文件
j) 允许在服务端执行脚本,可以用JS编写某个函数,直接在服务端执行,也可以把函数的定义存储在服务点,下次直接调用
k) 支持各种编程语言,安装简单
3. Mongodb工具
a) 监控
i. Munin:网络和系统监控工具
ii. Gangila:mongodb高性能的系统监视的工具
iii. Cacti:基于图形界面的开源工具,查看CPU负载,网络带宽利用率
MongoDB概念解析
1. 文档,集合,数据库
2. 数据库:
a) 一个mongodb可以建立多个数据库,默认为db,单个实例可以容纳多个独立的数据库,每一个都有自己的集合和权限,不同数据库放置在不同的文件中。
3. 文档
a) 键值对,不需要设置相同的字段,相同的字段不需要相同的数据类型
b) 键值对有序
c) 文档中的值不仅是字符串,还可以是其它数据类型甚至嵌入的文档
d) 区分大小写和类型,不能有重复的键
e) 键命名不能空字符,$符号特定情况下使用,下划线开头的键是保留的。
4. 集合:Mongo的文档组,相当于table,没有固定结构,可以插入不同格式和类型的数据,
a) 集合名不能是空字符串,不能含有空字符串,不能以system.开头,不能含有保留自负
b) Capped collections:固定大小的集合
i. 高性能,队列过期的特性
ii. 高性能自动的维护对象的插入顺序,适合类似记录日志的功能,必须显示创建,指定一个集合的大小,单位为字节,数据存储空间值提前分配。
iii. 能添加新的对象,能进行更新,然而对象不会增加存储空间,如果增加就会失败,
iv. 不允许删除,使用drop()删除集合所有的行,删除后必须显示地重新创建这个collection
5. db.createCollection("mycoll", {capped:true, size:100000})
6. 元数据
MongoDB创建数据库
1. use 创建数据库
2. db.dropDatabase() 删除数据库
3. db.collection.drop() 删除集合
4. db.COLLECTION_NAME.insert(document) 使用insert()或save() 向集合中插入文档。插入文档你也可以使用db.col.save(document) 命令。如果不指定 _id 字段 save() 方法类似于 insert() 方法。如果指定 _id 字段,则会更新该 _id 的数据。也可以用变量
变量名=(。。。)
5. db.COLLECTION_NAME.find()查看已插入文档
6. update()和save()更新文档
db.collection.update(
{
Upsert:
Multi:
WriteConcern:
}
)
Save()方法,通过传入的文档来替换。
db.collection.save(
{
writeConcern:
}
)
Inc set
7.删除文档 db.collection.remove{
db.collection.remove(
{
justOne:
writeConcern:
}
)
删除所有数据 db.col.remove({}) 类似SQL的truncate命令
7. 查询文档db.collectionname.find().pretty() findOne() 返回一个文档
传入多个key用逗号隔开 相当于AND条件
Db.col.find( {$or:[{ 条件 } ] } )
8. MongoDB 条件操作符
a) 大于 $gt
b) 小于 $lt
c) 大于等于 $gte
d) 小于等于 $lte
e) 不等于 $ne
9. $type操作符,用来匹配的,具体查表
10. db.COLLECTION_NAME.find().limit(NUMBER) 接受数字参数指定读取指定数量的数据记录
11. skip(number) 跳过几条
12. MongoDB排序:db.COLLECTION_NAME.find().sort({KEY:1}) 1为升序,-1为降序
13. MongoDB索引,极大提高效率,接受可选参数
a) db.COLLECTION_NAME.ensureIndex({KEY:1})
b) 后台创建索引db.values.ensureIndex({open: 1,close: 1}, {background: true})
14. MongoDB聚合
a) Db.collection_name.aggregate(操作)
b) 管道的概念:用于将当前命令的输出结果作为下一个命令的参数。管道操作可以重复,表达式无状态。
c) 聚合框架几个常用的操作
i. $project:修改输入文档的结构。可以用来重命名、增加或删除域,也可以用于创建计算结果以及嵌套文档。
ii. $match:用于过滤数据,只输出符合条件的文档。$match使用MongoDB的标准查询操作。
iii. $limit:用来限制MongoDB聚合管道返回的文档数。
iv. $skip:在聚合管道中跳过指定数量的文档,并返回余下的文档。
v. $unwind:将文档中的某一个数组类型字段拆分成多条,每条包含数组中的一个值。
vi. $group:将集合中的文档分组,可用于统计结果。
vii. $sort:将输入文档排序后输出。
viii. $geoNear:输出接近某一地理位置的有序文档。
15. MongoDB复制:将数据同步在多个服务器的过程。
a) 从主节点读取数据和写入数据,主节点与从节点进行数据交互。这个还是挺难的感觉
16. MongoDB分片
a) 没看懂啊
17. MongoDB备份(mongodump)与恢复(mongorestore)
a) 备份语法 mongodump –h dbhost –d dbname -o dbdirectory
i. –h:mongodb所在服务器地址,例如127.0.0.1,或者指定端口号127.0.0.1:27017
ii. –d 需要备份的数据库实例
iii. –O 备份的数据存放位置,需要提前建立
iv. 有一些可选参数
b) MongoDB数据恢复
i. Mongorestore –h
1. –host<:port>,-h<:port> mongodb所在服务器地址,默认localhost:27017
2. –db.-d:需要恢复的数据库实例
3. –drop:会先删除当前数据再恢复备份的数据
4.
5. –dir 指定备份的目录 不能同时指定path和dir
18. MongoDB 监控 数据的意义
a) Mongostat命令
b) Mongotop 可以带参数,等待的时间长度,秒为单位
i. –locks 报告每个数据库的锁的使用中
MongoDB高级教程
1.MongoDB关系:文档间可以通过嵌入和引用来建立联系。
a)嵌入式关系:缺点是如果用户和用户地址不断增加,数据量不断变大,会影响读写性能。
b)引用式关系:把用户数据文档和用户地址数据文档分开,通过引用文档id字段来建立关系,
2.MongoDB数据库引用
A)手动引用(ManualReferences)
B)DBRefs
I.{$ref集合名称 :,$id引用的id :, $db数据库名称,可选参数 :}
3.MongoDB覆盖索引查询:所有的查询字段是索引的一部分,所有的查询返回字段在同一个索引中
A)