MongoDB---进阶简析
a.命令的工作原理
drop命令,在shell中删除一个集合,执行db.refactor.drop().其实这个函数实际运行的是drop命令,
可以用runCommand来达到一样的效果:
db.runCommand({"drop":"refactor"})
{
"nIndexesWas" : 1,
"msg" : "indexes dropped for collection",
"ns" : "test.refactor",
"ok" : 1 www.2cto.com
}
命令的响应是一个文档,包含了命令是否执行成功,还可能有些其他的命令输出的信息.命令的响应文档
都有一个"ok"键.ok键的值为1表示执行成功,为0表示执行失败,当为0时,会有一个"errmsg"键,
它的值表示命令失败的原因.
MongoDB中的命令其实是作为一种特殊类型的查询实现的,这些查询针对$cmd集合来执行.runCommand
仅仅是接受命令文档,执行等价查询,因此drop调用实际上是这样的:
db.$cmd.findOne({"drop":"refactor"})
当MongoDB服务器得到查询$cmd集合的请求时,会启动一套特殊的逻辑来处理,而不是交给普通的查询代码来执行.
几乎所有MongoDB驱动程序都提供一个类似runCommand的帮助方法来执行命令,如果有必要,也可以使用一个
简单查询的方式来运行命令.
访问有些命令需要有管理员权限,必须在admin
数据库里面运行.
b)要获得所有命令的最新列表,可以在shell中运行db.listCommands(),
也可以使用http://localhost:28017/_commands
2.固定集合 www.2cto.com
MongoDB不仅支持普通集合,还支持 固定集合,固定集合要事先创建,而且大小固定.
固定集合像一个环形队列,如果空间不足,最早的文档就会被删除,为新的文档提供空间.
固定集合在新文档插入的时候自动淘汰最早的文档.
固定集合不能删除文档(自动淘汰文档除外),更新(尺寸增大)将导致文档移动.
固定集合中的文档以插入的顺序存储,不用维护一个已删除的文档释放空间列表.
固定集合默认情况下没有索引,即便是"_id"上也没有索引.
a.固定集合的属性和用法
对固定集合插入的速度很快,做插入操作时,无需额外分配空间,服务器也不必查找空闲列表来放置文档,
直接将文档插入集合的末尾就行了,如果有必要就将旧的覆盖.默认情况下插入也无需更新索引.
对固定集合按照插入顺序输出的查询速度很快,以为文档本身就是按照插入顺序存储的,按照这个
顺序查询就是遍历一下,返回结果的顺序就是文档在磁盘上的顺序.默认情况下,对固定集合进行查找都
会以插入的顺序返回结果.
固定集合能在新数据插入时,自动淘汰最早的数据.插入快速,按照插入顺序查询也很快,自动淘汰,这几个
属性组合起来使得固定集合特别适合像日志这种应用场景.事实上,MongoDB中设计固定集合的目的
就是用来存储内部的复制日志oplog.固定集合还有一个用法是缓存少量的文档,一般来说,固定集合
使用与任何想要自动淘汰过期属性的场景.
b.创建固定集合
固定集合必须要在使用前显示的创建.
如:
db.createCollection("refactorCapped",{"capped":true,size:100000,max:100})
上面的命令创建了一个固定集合refactorCapped,大小是100000字节,最大的文档数100.
当指定文档数量的上限时,必须同时指定大小.淘汰机制只有在容量还没有满时才会依据文档数量来工作. www.2cto.com
要是容量满了,淘汰机制则会依据容量来工作.
可以将普通集合转化成固定集合,如将blog集合转换成大小为10000字节的固定集合
db.runCommand({convertToCapped:"blog",size:10000})
c.自然排序
固定集合的排序方式叫做自然排序.自然排序就是文档在磁盘上的顺序.
因为固定集合的文档总是按照插入的顺序存储的,自然顺序就是这样的.默认情况下,
查询固定集合后就是按照插入的顺序返回文档.也可以使用自然排序按照反向插入的顺序查询
如
db.blog.find().sort({"$natural":-1})
3.GridFS
GridFS是一种在MongoDB中存储大二进制文件的机制,使用GridFS存文件的原因:
GridFS可以直接利用已经建立的复制或分片机制,对文件存储来说故障恢复和扩展都很容易
GridFS可以避免用于存储用户上传内容的文件系统出现的某些问题,如GridFS在同一个目录下放置大量的文件是没有问题的.
GridFS不产生磁盘碎片,因为MongoDB分配数据文件空间时以2GB为一块.
a.使用GridFS
最简单使用GridFS的方法是利用mongofiles.mongofiles可以用来在GridFS中上传,
下载,列示,查找和删除文件.
可以用 mongofiles --help获得帮助
如:
b)内部原理
GridFS是一个建立在普通MongoDB文档基础上的轻量级文件存储规范.MongoDB服务器实际上对GridFS请求和普通的
请求一样,所有相关工作都由客户端驱动或者工具来完成.
GridFS的基本思想是可以将大文件分成很多块,每块作为一个单独的文档存储,这样就能存储大文件了.由于MongoDB
支持在文档中存储二进制数据,可以最大限度减小块的存储开销.另外,除了存储文件本身的快,还有一个单独的文档用来 www.2cto.com
存储分块的信息和文件的元数据.
GridFS的块有个单独的集合,默认情况下,块将使用fs.chunks集合,如果需要可以覆盖.这个块集合里面文档的结构很简单
{
"_id":ObjectId("...."),
"n":0,
"data":BindData("..."),
"files_id":ObjectId("....")
}
和别的MongoDB文档一样,块也有自己唯一的"_id".files_id键是包含这个块元数据的文件文档的"_id".
n表示块编号,也就是这个块在源文件中的顺序编号,data包含组成文件块的二进制数据.
文件的元数据放在另一个集合中,默认是fs.files.这里面的每个文档代表GridFS中的一个文件,与文件相关的
自定义元数据也可以存在其中.除了用户自定义的键,GridFS规范定义了一些键
_id
文件唯一的id,在块中作为files_id键的值存储
length
文件内容总的字节数
chunksize
每块