一、MongoDB特点
1.内置GridFS,支持大容量的存储:
GridFS是一个出色的分布式文件系统,可以支持海量的数据存储。
内置了GridFS了MongoDB,能够满足对大数据集的快速范围查询。
2.内置 Auto- Sharding 自动分片支持云级扩展性,分片简单。
3.海量数据下,性能优越:
在使用场合下,千万级别的文档对象,近10G的数据,对有索引的ID的查询不会比mysql慢,而对非索引字段的查询,则是全面胜出。 mysql实际无法胜任大数据量下任意字段的查询,而mongodb的查询性能实在让我惊讶。写入性能同样很令人满意,同样写入百万级别的数 据,mongodb比我以前试用过的couchdb要快得多,基本10分钟以下可以解决。补上一句,观察过程中mongodb都远算不上是CPU杀手。
4.全索引支持,扩展到内部对象和内嵌数组
索引通常能够极大的提高查询的效率,如果没有索引,MongoDB在读取数据时必须扫描集合中的每个文件并选取那些符合查询条件的记录。
这种扫描全集合的查询效率是非常低的,特别在处理大量的数据时,查询可以要花费几十秒甚至几分钟,这对网站的性能是非常致命的。
5.MapReduce 支持复杂聚合(Aggregation)
6.与关系型数据库相比,MongoDB的缺点:
mongodb不支持事务操作:
所以事务要求严格的系统(如果银行系统)肯定不能用它。mongodb占用空间过大:
原因:
1、空间的预分配:为避免形成过多的硬盘碎片,mongodb每次空间不足时都会申请生成一大块的硬盘空间,而且申请的量从64M、128M、256M那 样的指数递增,直到2G为单个文件的最大体积。随着数据量的增加,你可以在其数据目录里看到这些整块生成容量不断递增的文件。
2、字段名所占用的空间:为了保持每个记录内的结构信息用于查询,mongodb需要把每个字段的key-value都以BSON的形式存储,如果 value域相对于key域并不大,比如存放数值型的数据,则数据的overhead是最大的。一种减少空间占用的方法是把字段名尽量取短一些,这样占用 空间就小了,但这就要求在易读性与空间占用上作为权衡了。
3、删除记录不释放空间:这很容易理解,为避免记录删除后的数据的大规模挪动,原记录空间不删除,只标记“已删除”即可,以后还可以重复利用。
4、可以定期运行db.repairDatabase()来整理记录,但这个过程会比较缓慢
二、下载安装
官网地址:https://www.mongodb.com/download-center#community
OS 使用brew安装:
brew install [email protected]
启动
brew services start mongodb-community
连接MongoDB
本地:mongo
远程:mongodb://admin:123456@localhost:27017/
MongoDB概念
SQL术语 | MongoDB术语 | 说明 |
---|---|---|
database | database | 数据库 |
table | collection | 数据库表/集合 |
row | document | 数据记录行/文档 |
column | field | 数据字段/域 |
index | index | 索引 |
常用命令
略
索引
略
聚合和管道
略
三、副本集
见文章:副本集
四、MongoDB分片集群
见文章:MongoDB分片集群
五、数据备份(mongodump)和恢复(mongorestore)
MongoDB数据备份
在Mongodb中我们使用mongodump命令来备份MongoDB数据。该命令可以导出所有数据到指定目录中。
mongodump命令可以通过参数指定导出的数据量级转存的服务器。
语法
mongodump命令脚本语法如下:
mongodump -h dbhost -d dbname -o dbdirectory
- -h:
MongDB所在服务器地址,例如:127.0.0.1,当然也可以指定端口号:127.0.0.1:27017 - -d:
需要备份的数据库实例,例如:test - -o:
备份的数据存放位置,例如:c:\data\dump,当然该目录需要提前建立,在备份完成后,系统自动在dump目录下建立一个test目录,这个目录里面存放该数据库实例的备份数据
MongoDB数据恢复
mongodb使用 mongorestore 命令来恢复备份的数据。
语法
mongorestore命令脚本语法如下:
mongorestore -h
<:port> -d dbname
- -host <:port>, -h <:port>:
MongoDB所在服务器地址,默认为: localhost:27017 - -db , -d :
需要恢复的数据库实例,例如:test,当然这个名称也可以和备份时候的不一样,比如test2 - -drop:
恢复的时候,先删除当前数据,然后恢复备份的数据。就是说,恢复后,备份后添加修改的数据都会被删除,慎用哦!
:
mongorestore 最后的一个参数,设置备份数据所在位置,例如:c:\data\dump\test。
你不能同时指定和 --dir 选项,--dir也可以设置备份目录。 - -dir:
指定备份的目录
你不能同时指定和 --dir 选项。
六、MongoDB监控
MongoDB中提供了mongostat 和 mongotop 两个命令来监控MongoDB的运行情况。
mongostat 命令
mongostat是mongodb自带的状态检测工具,在命令行下使用。它会间隔固定时间获取mongodb的当前运行状态,并输出。如果你发现数据库突然变慢或者有其他问题的话,你第一手的操作就考虑采用mongostat来查看mongo的状态。
mongotop 命令
mongotop也是mongodb下的一个内置工具,mongotop提供了一个方法,用来跟踪一个MongoDB的实例,查看哪些大量的时间花费在读取和写入数据。 mongotop提供每个集合的水平的统计数据。默认情况下,mongotop返回值的每一秒。
输出结果字段说明:
- ns:
包含数据库命名空间,后者结合了数据库名称和集合。 - total:
mongod花费的时间工作在这个命名空间提供总额。 - read:
提供了大量的时间,这mongod花费在执行读操作,在此命名空间。 - write:
提供这个命名空间进行写操作,这mongod花了大量的时间。
七、MongoDB 覆盖索引查询和高级索引
见文章:MongoDB覆盖索引查询和高级索引
八、MongoDB Map Reduce
Map-Reduce是一种计算模型,简单的说就是将大批量的工作(数据)分解(MAP)执行,然后再将结果合并成最终结果(REDUCE)。
MongoDB提供的Map-Reduce非常灵活,对于大规模数据分析也相当实用。
MapReduce命令语法:
db.collection.mapReduce(
function() {emit(key,value);}, //map 函数
function(key,values) {return reduceFunction}, //reduce 函数
{
out: collection,
query: document,
sort: document,
limit: number
}
)
使用 MapReduce 要实现两个函数 Map 函数和 Reduce 函数,
Map 函数调用 emit(key, value), 遍历 collection 中所有的记录, 将 key 与 value 传递给 Reduce 函数进行处理。
Map 函数必须调用 emit(key, value) 返回键值对。
参数说明:
- map :映射函数 (生成键值对序列,作为 reduce 函数参数)。
- reduce 统计函数,reduce函数的任务就是将key-values变成key-value,也就是把 values数组变成一个单一的值value。。
- out 统计结果存放集合 (不指定则使用临时集合,在客户端断开后自动删除)。
- query 一个筛选条件,只有满足条件的文档才会调用map函数。(query。limit, sort可以随意组合)
- sort 和limit结合的sort排序参数(也是在发往map函数前给文档排序),可以优化分 组机制
- limit 发往map函数的文档数量的上限(要是没有limit,单独使用sort的用处不大)
示例: demo_auto集合中筛选( gender: "女"),按name分组,计算 每个名字的人的个数。将结果放到集合total中
集合数据
db.getCollection("demo_auto").insert([ {
_id: ObjectId("603746d62ff96a0006bea3d5"),
name: "戚薇",
gender: "女",
age: "12"
} ]);
db.getCollection("demo_auto").insert([ {
_id: ObjectId("603750ab5f3ee121e806620a"),
name: "李沁",
age: 10,
gender: "女"
} ]);
db.getCollection("demo_auto").insert([ {
_id: ObjectId("603774a85f3ee121e806620c"),
gender: "男",
name: "女"
} ]);
db.getCollection("demo_auto").insert([ {
_id: ObjectId("603774a85f3ee121e806620c"),
gender: "女",
name: "大名"
} ]);
db.getCollection("demo_auto").insert([ {
_id: ObjectId("603774a85f3ee121e806620c"),
gender: "男",
name: "AA"
} ]);
统计语句:
db.demo_auto.mapReduce(
function() {emit(this.name, 1);},
function(key, values) {return Array.sum(values)},
{
out: "total",
query: {
gender: "女"
}
}
)
流程:
九、MongoDB 全文检索
全文检索对每一个词建立一个索引,指明该词在文章中出现的次数和位置,当用户查询时,检索程序就根据事先建立的索引进行查找,并将查找的结果反馈给用户的检索方式。
目前MongoDB全文索引,还不支持中文
示例
-
建集合
db.createCollection('posts');
-
新增数据
db.posts.save( { "post_text": "enjoy the mongodb articles on Runoob", "tags": [ "mongodb", "runoob" ] } )
-
建索引
db.posts.ensureIndex({post_text:"text"})
-
使用全文检索
db.posts.find({$text:{$search:"runoob"}})
十、MongoDB 固定集合(Capped Collections)
MongoDB 固定集合(Capped Collections)是性能出色且有着固定大小的集合,对于大小固定,我们可以想象其就像一个环形队列,当集合空间用完后,再插入的元素就会覆盖最初始的头部的元素!
功能特点
- 可以插入及更新,但更新不能超出collection的大小,否则更新失败,不允许删除,但是可以调用drop()删除集合中的所有行,但是drop后需要显式地重建集合。
- 在32位机子上一个cappped collection的最大值约为482.5M,64位上只受系统文件大小的限制。
用法
- 用法1:储存日志信息
- 用法2:缓存一些少量的文档
十一、MongoDB+Springboot
见文章:MongoDB+Springboot简单配置使用