MongoDB简介
MongoDB是什么
MongoDB是一个使用C++编写的、开源的、面向文档的NoSQL(Not Only SQL)数据库,
也是当前最热门的NoSql数据库之一。
n NoSQL简介
NoSQL的意思是“不仅仅是SQL”,是目前流行的“非关系型数据库”的统称。
常见的NoSQL数据库如:Redis、CouchDB、MongoDB、HBase、Cassandra等
n 为什么需要NoSQL?
简单的说,就是为了解决在web2.0时代,出现的三高要求:
1:对数据库高并发读写的需求
2:对海量数据的高效率存储和访问的需求
3:对数据库的高可扩展性和高可用性的需求
而RDB里面的一些特性,在web2.0里面往往变得不那么重要,
比如:
1:数据库事务一致性
2:数据库的实时读写
3:复杂的SQL查询,特别是多表关联查询
CAP定理, 又被称作布鲁尔定理(Eric Brewer) 它指出对于一个分布式计算系统来说,不可能同时满足以下三点:
1:强一致性(Consistency):系统在执行过某项操作后仍然处于一致的,在分布式系统中,更 新操作执行成功后所有的用户都应该读取到最新的值,这样的系统被认为具有强一致性
2:可用性(Availability):每一个操作总是能够在一定的时间内返回结果
3:分区容错性(Partition tolerance):系统在存在网络分区的情况下仍然可以接受请求并处
理,这里网络分区是指由于某种原因网络被分成若干个孤立区域,而区域之间互不相通
n 根据CAP原理将数据库分成了满足CA原则、满足CP原则和满足AP原则三大类:
1:CA:单点集群,满足一致性,可用性,通常在可扩展性上不太强大,比如RDB
2:CP:满足一致性和分区容错性,通常性能不是特别高,如分布式数据库
3:AP:满足可用性和分区容错性,通常可能对一致性要求低一些,如大多数的NoSQL
n BASE(Basically Available,Soft-state,Eventual consistency )
1:基本可用(Basically Available):系统能够基本运行、一直提供服务。
2:软状态(Soft-state):系统不要求一直保持强一致状态。
3:最终一致性(Eventual consistency):系统需要在某一时刻后达到一致性要求
NoSQL的优点 扩展简单方便,尤其是水平横向扩展
(纵向扩展是指用更强的机器;横向扩展是指把数据分散到多个机器)
读写快速高效,多数都会映射到内存操作
成本低廉,用普通机器,
分布式集群即可
数据模型灵活,
没有固定的数据模型
n NoSQL的缺点
不提供对SQL的支持 现有产品还不够成熟稳定,功能也还有待加强
n MongoDB特点
高性能、易于使用、易于扩展、功能丰富
面向集合存储
模式自由
支持动态查询
支持javascript表达式查询 支持索引
支持副本集复制和自动故障恢复
自动处理分片
支持二进制和大型对象数据
文件存储格式为BSON(JSON的一种扩展)
MongoDB基本概念
数据库 MongoDB的一个实例可以拥有一个或多个相互独立的数据库,每个数据库都有自己的集合
n 集合 集合可以看作是拥有动态模式的表
n 文档
文档是MongoDB中基本的数据单元,类似于RDB的行。 文档是键值对的一个有序集合。在JS中,文档被表示成对象。
n _id 每个文档都有个特殊的“_id”,在文档所属集合中是唯一的
n JavaScript shell
MongoDB自带了一个功能强大的JavaScript Shell,可以用于管理或操作MongoDB
n MongoDB和RDB的一些对比
1:都有数据库的概念
2:集合 --〉RDB的表
3:文档 --〉RDB表中的一条记录
4:文档对象里面的 key --〉 RDB表中的字段
5:文档对象里面的 value--〉 RDB表中字段的值
6:MongoDB中没有主外键的概念
数据库名称定义规则
1:不能是空串
2:不得含有/、\、?、$、空格、空字符等等,基本只能使用ASCII中的字母和数字
3:区分大小写,建议全部小写
4:最多为64字节
5:不得使用保留的数据库名,比如:admin,local,config 注意:数据库最终会成为文件,数据库名就是文件的名称
n 集合名称定义规则
1:不能是空串
2:不能包含\0字符(空字符),这个字符表示集合名的结束,也不能包含”$”
3:不能以”system.”开头,这是为系统集合保留的前缀
n 文档的键的定义规则
1:不能包含\0字符(空字符),这个字符表示键的结束
2:“.”和“$”是被保留的,只能在特定环境下用
3:区分类型,同时也区分大小写
4:键不能重复 注意:文档的键值对是有顺序的,相同的键值对如果有不同顺序的话,也是不同的文档
MongoDB基本的数据类型
数据类型 null 布尔值 32位整数
64位整数
描述 表示空值或者未定义的对象 真或者假:true或者false
shell不支持该类型,默认会转换成64位浮点数, 也可以使用NumberInt类,比如:
shell不支持该类型,默认会转换成64位浮点数, 也可以使用NumberLong类,比如:
举例 {"x":null} {"x":true}
{“x”:NumberInt(“3”)}
64位浮点数 shell中的数字就是这一种类型
字符串 UTF-8字符串
符号 shell不支持,shell会将数据库中的符号类型的数据自动转换成字符串 对象id 文档的12字节的唯一id {"id": ObjectId()} 日期 从标准纪元开始的毫秒数 {"date":new Date()} 正则表达式 文档中可以包含正则表达式,遵循JavaScript的语法 {"foo":/foobar/i}
代码 文档中可以包含JavaScript代码 未定义 undefined
数组 值的集合或者列表
内嵌文档 文档可以作为文档中某个key的value
{"x":function() {}} {"x":undefined}
{"arr": ["a","b"]} {"x":{"foo":"bar"}}
MongoDB增删改操作
运行shell,命令:mongo ip:port
n 显示现有的数据库,命令:show dbs 或者 databases;
n 显示当前使用的数据库,命令:db
n 切换当前使用的数据库,命令:use 数据库名称
n 创建数据库:MongoDB没有专门创建数据库的语句,可以使用“use” 来使用某个数据库,如果要使用
的数据库不存在,那么将会创建一个,会在真正向该库加入文档后,保存成为文件。
n 删除数据库,命令:db.dropDatabase()
n 显示现有的集合,命令:show collections 或者 tables;
n 创建集合:在MongoDB中不用创建集合,因为没有固定的结构,直接使用db.集合名称.命令 来操作就可
以了。如果非要显示创建集合的话,用:db.createCollecion(“集合名称”);
n 插入并保存文档
insert方法,可以单独插入一个文档,也可以插入多个,用“[ ]”即可。注意: 1:MongoDB会为每个没有“_id”字段的文档自动添加一个”_id”字段 2:每个Doc必须小于16MB 3:可以在shell中执行Object.bsonsize(文档名称);来查看size大小
n 删除文档,命令:remove , 可以按条件来删除 只是删除文档,集合还在,如果使用 drop命令,会连带集合和索引都删掉
n 查看集合的状态信息:db.集合名.stats();
查看集合中所有的文档,命令:db.集合名称.find();
n 查看集合中第一个文档,命令:db.集合名称.findOne({条件对象});
n 文档替换,命令: db.集合名称. update(条件,新的文档);
n 更新修改器,用来做复杂的更新操作
1:$set :指定一个字段的值,如果字段不存在,会创建一个
2:$unset :删掉某个字段
3:$inc :用来增加已有键的值,如果字段不存在,会创建一个。只能用于整型、长整型、或双精度浮点型
的值。
4:$push:向已有数组的末尾加入一个元素,要是没有就新建一个数组
5:$each:通过一次$push来操作多个值
6:$slice:限制数组只包含最后加入的n个元素,其值必须是负整数
7:$sort:对数组中的元素,按照指定的字段来对数据进行排序(1为升序,-1为降序),然后再按照slice
删除。注意:不能只将$slice或者$sort与$push配合使用,且必须使用$each
8:$ne:判断一个值是否在数组中,如果不在则添加进去
9:$addToSet:将数组作为数据集使用,以保证数组内的元素不会重复
10:$pop :从数组一端删除元素,{$pop:{key:1}},从末尾删掉一个,-1则从头部删除
11:$pull:按照条件来删除所有匹配的元素
12:$:用来修改第一个匹配的元素
save方法 如果文档存在就更新,不存在就新建,主要根据”_id”来判断。
n upsert 找到了符合条件的文档就更新,否则会以这个条件和更新文档来创建一个新文档。 指定update方法的第三个参数为true,可表示是upsert
n 更新多个文档 MongoDB默认只更新符合条件的第一个文档,要更新所有匹配的文档,把第4个参数设置为true。注意:
1:只能用在$XXX的操作中
2:最好每次都显示的指定update的第4个参数,以防止服务器使用默认行为
n 查询更新了多少个文档
使用命令:getLastError ,返回最后一次操作的相关信息,里面的n就是更新的文档的数量。形如:db.runCommand({"getLastError":1});
MongoDB查询操作
指定需要返回的键 在find方法的第二个参数进行指定。默认情况下,始终会返回”_id”,可以通过设 置字段为0来表示不返回这个字段。
n 按条件查询
在find方法里面加入条件数据即可,find方法的第一个参数就是。
注意:条件数据必须是常量值,不能是另外的字段的数据
1:比较操作:$lt,$lte,$gt,$gte,$ne
2:$and:包含多个条件,他们之间为and的关系
3:$or :包含多个条件,他们之间为or的关系 ,$nor相当于or取反
4:$not:用作其他条件之上,取反
5:$mod:将查询的值除以第一个给定的值,如果余数等于等二个值则匹配成功
6:$in :查询一个键的多个值,只要键匹配其中一个即可 , $nin为不包含
7:$all:键需要匹配所有的值
8:$exists:检查某个键是否存在,1表示存在,0表示不存在
9:null类型:不仅能匹配键的值为null,还匹配键不存在的情况
正则表达式 MongoDB使用Perl兼容的正则表达式(PCRE),
比如: db.users.find({“name”:/sishuok/i});
又比如: db.users.find({“name”:/^sishuok/});
查询数组
1:单个元素匹配,就跟前面写条件一样,{key:value}
2:多个元素匹配,使用$all, {key:{$all:[a,b]}},元素的顺序无所谓
3:可以使用索引指定查询数组特定位置, {“key.索引号”:value}
4:查询某个长度的数组,使用$size
5:指定子集,使用$slice,正数是前面多少条,负数是尾部多少条,也可以指定偏移量和要返回的元素数量,比如:$slice:[50,10]
6:可以使用$来指定符合条件的任意一个数组元素,如:{”users.$”:1}
7:$elemMatch:要求同时使用多个条件语句来对一个数组元素进行比较判断
查询内嵌文档
1:查询整个内嵌文档与普通查询是一样的
2:如果要指定键值匹配,可以使用“.” 操作符,比如:{“name.first”:”a” , “name.last”:”b”}
3:如果要正确的指定一组条件,那就需要使用$elemMatch,以实现对内嵌文档的多个键进行匹配操
作 注意:内嵌文档的查询必须要整个文档完全匹配
n $where查询
在查询中执行任意的JavaScript,通过编程来解决查询的匹配问题,方法返回boolean值。
function t1(){
for(var a in this){
if(a=="a"){return true;} }
return false;
}
使用的时候:db.users.find({"$where":t1}); 注意:$where性能较差,安全性也是问题,所以不到万不得已,不要使用
查询记录条数的命令:count
1:直接使用count()的话,得到的是整个记录的条数
2:如果要获取按条件查询后记录的条数,需要指定count(true或者非0的数)
n 限制返回的记录条数的命令:limit(要返回的条数)
n 限制返回的记录条数起点的命令:skip(从第几条开始返回)
n 排序的命令:sort({要排序的字段:1为升序,-1为降序})
1:可以对多个字段进行排序
2:MongoDB处理不同类型的数据是有一定顺序的,有时候一个键有多种类型的值,其排序顺序是预先定义好
的,从小到大如下:
(1)最小值
(2)null
(3)数字
(4)字符串
(5)对象/文档
(6)数组
(7)二进制数据
(8)对象id
(9)布尔类型
(10)日期型
(11)时间戳
(12)正则表达式
(13)最大值
当然也可以使用其他方式来分页,比如采用自定义的id,然后根据id来分页
n 查询给定键的所有不重复的数据,
命令:distinct
语法:db.runCommand({“distinct”:集合名,“key”:”获得不重复数据的字段”});
游标
1:获取游标,示例如下:
var c = db.users.find();
2:循环游标,可以用集合的方式,示例如下:
while(c.hasNext()){
printjson(c.next());
}
3:也可以使用forEach来循环,示例如下:
c.forEach(function(obj){
print(obj);
});
存储过程
1:MongoDB的存储过程其实就是个自定义的js函数
2:使用db.system.js.save({“_id”:名称,value:函数});
3:可以通过如下命令查看:db.system.js.find();
4:可以通过如下命令调用:db.eval(名称);
聚合框架
简介
MongoDB的聚合框架,主要用来对集合中的文档进行变换和组合,从而对数据进行分析以加以利用。 聚合框架的基本思路是:采用多个构件来创建一个管道,用于对一连串的文档进行处理。
这些构件包括:
筛选(filtering)、投影(projecting)、分组(grouping)、排序(sorting)、限制(limiting)和跳过(skipping)。
n 使用聚合框架的方式
db.集合.aggregate(构件1,构件2...) 注意:由于聚合的结果要返回到客户端,因此聚合结果必须限制在16M以内,这是MongoDB支持的最大响应消息的大小。
n 准备样例数据
for(var i=0;i<100;i++){
for(var j=0;j<4;j++){ db.scores.insert({"studentId":"s"+i,"course":"课程"+j,"score":Math.random()*100});
} }
n 示例要完成的功能 找出考80分以上的课程门数最多的3个学生
是用聚合框架来完成功能的步骤
1:找到所有考了80分以上的学生,不区分课程
{"$match":{"score":{$gte:80}}}
2:将每个学生的名字投影出来
{"$project":{"studentId":1}}
3:对学生的名字排序,某个学生的名字出现一次,就给他加1
{"$group":{"_id":"$studentId","count":{"$sum":1}}}
4:对结果集按照count进行降序排列
{"$sort":{"count":-1}}
5:返回前面的3条数据
{"$limit":3}
最终执行的语句就是:
db.scores.aggregate(
{"$match":{"score":{$gte:80}}}
- , {"$project":{"studentId":1}}
- , {"$group":{"_id":"$studentId","count":{"$sum":1}}} , {"$sort":{"count":-1}}
, {"$limit":3}
)
管道操作符简介
每个操作符接受一系列的文档,对这些文档做相应的处理,然后把转换后的文档作为结果传递给下一个操作符。最后一个操作符会将结果返回。不同的管道操作符,可以按照任意顺序,任意个数组合在一起使用。
管道操作符
$match
用于对文档集合进行筛选,里面可以使用所有常规的查询操作符。通常会放置在管道最前面的位置,理由如下:
1:快速将不需要的文档过滤,减少后续操作的数据量
2:在投影和分组之前做筛选,查询可以使用索引
管道操作符
$project
用来从文档中提取字段,可以指定包含和排除字段,也可以重命名字段。 比如要将studentId改为sid,如下:
db.scores.aggregate({"$project":{"sid":"$studentId"}}) 管道操作符还可以使用表达式,以满足更复杂的需求。
管道操作符$project的数学表达式
比如给成绩集体加20分,如下: db.scores.aggregate({"$project":{"newScore":{$add:["$score",20]}}})
支持的操作符和相应语法:
1:$add : [expr1[,expr2,...exprn]]
2:$subtract:[expr1,expr2]
3:$multiply:[expr1[,expr2,...exprn]]
4:$divice:[expr1,expr2]
5:$mod:[expr1,expr2]
n 管道操作符$project的日期表达式
聚合框架包含了一些用于提取日期信息的表达式,
如下: $year、$month、$week、$dayOfMonth、$dayOfWeek、$dayOfYear、$hour、$minute、 $second 。
注意:这些只能操作日期型的字段,不能操作数据,使用示例: {"$project":{"opeDay":{"$dayOfMonth":"$recoredTime"}}}
管道操作符$project的字符串表达式
1:$substr : [expr,开始位置,要取的字节个数]
2:$concat:[expr1[,expr2,...exprn]]
3:$toLower:expr
4:$toUpper:expr
例如:{"$project":{"sid":{$concat:["$studentId","cc"]}}}
n 管道操作符$project的逻辑表达式
1:$cmp:[expr1,expr2] :比较两个表达式,0表示相等,正数前面的大,负数后面的大
2:$strcasecmp:[string1,string2] :比较两个字符串,区分大小写,只对由罗马字符组成的
字符串有效
3:$eq、$ne、$gt、$gte、$lt、$lte :[expr1,expr2]
4:$and、$or、$not
5:$cond:[booleanExpr,trueExpr,falseExpr]:如果boolean表达式为true,返回true表达
式,否则返回false表达式
6:$ifNull:[expr,otherExpr]:如果expr为null,返回otherExpr,否则返回expr 例如:db.scores.aggregate({"$project":{"newScore":{$cmp:["$studentId","sss"]}}}
$group 用来将文档依据特定字段的不同值进行分组。选定了分组字段过后,就可以把这些
字段传递给$group函数的“_id”字段了。例如: db.scores.aggregate({“$group”:{“_id”:“$studentId”}}); 或者是 db.scores.aggregate({"$group":{"_id":{"sid":"$studentId","score":"$score"}}});
n $group支持的操作符
1:$sum:value :对于每个文档,将value与计算结果相加
2:$avg:value :返回每个分组的平均值
3:$max:expr :返回分组内的最大值
4:$min:expr :返回分组内的最小值
5:$first:expr :返回分组的第一个值,忽略其他的值,一般只有排序后,明确知道数据顺 序的时候,这个操作才有意义
6:$last:expr :与上面一个相反,返回分组的最后一个值
7:$addToSet:expr :如果当前数组中不包含expr,那就将它加入到数组中
8:$push:expr:把expr加入到数组中
拆分命令:$unwind 用来把数组中的每个值拆分成为单独的文档。
n 排序命令:$sort 可以根据任何字段进行排序,与普通查询中的语法相同。如果要对大量的文档进行排序,强烈建议在管道的第一个阶段进行排序,这时可以使用索引。
n 常见聚合函数
1:count:用于返回集合中文档的数量
2:distinct:找出给定键的所有不同值,使用时必须指定集合和键,例如:
db.runCommand({"distinct":"users","key":"userId"});
n MapReduce介绍
在MongoDB的聚合框架中,还可以使用MapReduce,它非常强大和灵活,但具有一定的复杂性,专门用于实现一些复杂的聚合功能。
MongoDB中的MapReduce使用JavaScript来作为查询语言,因此能表达任意的逻辑, 但是它运行非常慢,不应该用在实时的数据分析中。
MongoDB的文档存储
将文档插入到MongoDB的时候,文档是按照插入的顺序,依次在磁盘上相邻保存 因此,一个文档变大了,原来的位置要是放不下这个文档了,就需要把这个文档移动到集合的另外一个位置,通常是最后,能放下这个文档的地方。
MongoDB移动文档的时候,会自动修改集合的填充因子(padding factor),填充因子是为新文档预留的增长空间,不能手动设定填充因子。
1:填充因子开始可能是1,也就是为每个文档分配精确的空间,不预留增长空间
2:当有文档超长而被迫移动文档的时候,填充因子会增大
3:当集合中不再有文档移动的时候,填充因子会慢慢减小
MongoDB进行文档移动是非常慢的,移动文档的时候,MongoDB需要将文档原先占用的空间释放掉,然后将文档写入新的空间,相对费时,尤其是文档比较大,又频繁需要移动的话,会严重影响性能
MongoDB的索引
创建索引,命令:ensureIndex
1:创建索引时,1表示按升序存储,-1表示按降序存储
2:可以给索引指定名字,创建的时候指定 name 即可
3:可以创建复合索引,如果想用到复合索引,必须在查询条件中包含复合索引中的前N个索引列
4:如果查询条件中的键值顺序和复合索引中的创建顺序不一致的话,MongoDB可以智能的帮助我们调
整该顺序,以便使复合索引可以为查询所用
5:可以为内嵌文档创建索引,其规则和普通文档创建索引是一样的
6:一次查询中只能使用一个索引,$or特殊,可以在每个分支条件上使用一个索引
7:如果查询要在内存中排序的话,结果集不能超过32M
8:$where,$exists不能使用索引,还有一些低效率的操作符,比如:$ne,$not,$nin等
9:设计多个字段的索引时,应该尽量将用于精确匹配的字段放在索引的前面
10:MongoDB限制每个集合上最多只能有64个索引,建议在一个特定的集合上,不要设置多个索引。 11:如果要在后台运行创建索引,添加 {background:true}
n 查看已经创建的索引,命令:getIndexes
n 删除索引,命令:dropIndex
n 查看查询语句解释,命令:explain
explain的字段说明:
1:cursor:本次查询使用的索引
2:isMultiKey:是否使用了多键索引
3:n:返回的文档数量
4:nscannedObjects:按照索引指针去磁盘查找实际文档的次数
5:nscanned:如果使用索引,就是查找过的索引条目数量;如果全表扫描,就是查找过的文档数量
6:scanAndOrder:是否在内存中对结果集排序
7:indexOnly:是否只是用索引就能完成本次查询
8:nYields:为了让写入请求能顺利执行,本次查询暂停的次数
9:millis:本次查询所耗费的时间,单位是毫秒
10:indexBounds:描述索引的使用情况,给出了索引的遍历范围
指定使用的索引:hint
指定不使用索引,强制全表扫描:查询.hint({$natural:1});
唯一索引:在创建的时候,指定{“unique”:true}
1:唯一索引将会保证该字段的数据不会重复,如果重复插入,只会保存一条
2:索引能保存的数据值必须小于1024字节,这意味着超长的数据,不会保存到索引里,因此也就可以插入多个重复的数据了
3:复合索引也可以创建为唯一索引
4:在已有集合上创建唯一索引可能会失败,因为已经有了重复数据,此时可以指定dropDups来强制去重,但由于保留数据的不可控,因此对重要数据不建议使用
5:唯一索引会把null看作值,所以无法将多个缺少唯一索引的数据插入,这时可以指定sparse来创建一个稀疏索引,如:{“unique”:true,”sparse”:true}
索引的集合
所有索引信息都保存在system.indexes集合众,这是一个保留集合,不能在其中进行插入或删除文档,可以通过查询集合或者使用getIndexes来查看
Capped集合 (环队列)
简介 Capped集合的大小固定,性能好,如果空间用完了,新的对象会覆盖旧的对象。
find时默认就是插入的顺序,Capped集合会自动维护。
创建的语法:db.createCollection(集合名称,{“capped”:true,”size”:1000});
说明:size用来指定集合大小,单位为KB
限制集合中对象的个数:可以在创建时设置max参数 说明:指定max数量的时候必须同时指定size容量。淘汰机制只有在容量还没有满时才会依据文档数量来工作。要是容量满了,淘汰机制会依据容量来工作。
可以把已有的集合转化成为固定集合,反之不行。例如: db.runCommand({“convertToCapped”:”users”,”size”:1000});
使用和约束
1:32位机器上,一个Capped集合的最大值约为482.5M,64位只受系统文件大小的限制,创建的时候,可以预指定大小
2:可以向Capped集合中加入数据,但不能删除数据,也不能改变集合大小。
3:可以使用drop方法删除集合,删除后,需显示的重新创建这个集合
4:Capped集合在创建的时候,默认不会对任何键创建索引,如果要在”_id”上创建索引的话,在创建集合的时候,要使用autoIndexId的参数,设置为true
用GridFS存储文件
简介
GridFS是MongoDB用来存储大型二进制文件的一种存储机制。
特别适合用在存储一些不常改变,但是经常需要连续访问的大文件的情况。
GridFS的优点
1:能够简化技术栈,如果已经使用了MongoDB,那么使用GridFS,就不需要其它独立的存储工具了
2:GridFS会自动平衡已有的复制,或者为MongoDB设置的自动分片,所以对文件存储做故障转移或者是横向扩展会更容易
3:GridFS的功能不错,能自动解决一些其他文件系统遇到的问题,如在同一个目录下存储大量的文件
GridFS的缺点
1:性能较低,不如直接访问文件系统快
2:无法修改文档,如果要修改GridFS里面的文档,只能是先删除再添加基本操作 最简单的就是使用自带的mongofiles工具。
1:查看文件列表:mogofiles list
2:上传文件: mogofiles put 文件路径和文件名
3:下载文件: mogofiles get 文件名
4:查找文件: mogofiles search XXX,查找所有文件名中包含XXX的文件mogofiles list XXX ,查找所有文件名以XXX开头的文件
3:删除文件: mogofiles delete 文件名
n 基本原理 GridFS会将大文件分割为多个比较大的块,将每个快作为独立的文档进行存储,另外用一个文档来将这些块组织到一起,并存储该文件的元信息。
GridFS中的块被存储到专用的集合中,默认是fs.chunks,可以通过db.fs.chunks.find();
查看这个集合,里面的结构非常简单,说明如下:
1:files_id:块所属文件的元信息
2:n:块在文件中的相对位置
3:data:块所包含的二进制数据
GridFS中每个文件的元信息被存储到单独的集合中,默认是fs.files,里面的结构非常简单,
说明如下:
1:_id:文件唯一的id,就是前面的files_id
2:length:文件包含的字节数
3:chunkSize:组成文件的每个快的大小,单位是字节,这个值默认是256k
4:uploadDate:文件被上传到GridFS的日期
5:md5:文件内容的md5校验值