MongoDB 进阶
MongoDB支持大量的高级操作,这些操作都是用命令实现的。在shell中执行一个drop命令,删除一个集合
> db.tdate.drop()
true
在幕后这个操作实际是运行的drop命令,操作等价于
> db.runCommand({"drop":"tdate"})
{ "ns" : "test.tdate", "nIndexesWas" : 1, "ok" : 1 }
命令的响应作为一个文档,包含命令是否执行成功等信息。如果命令执行失败,会有一个errmsg的键。
> db.runCommand({"drop":"tdate"})
{ "ok" : 0, "errmsg" : "ns not found" }
MongoDB中的命令其实是作为一种特殊类型的查询来实现的,这些查询针对$cmd
集合来执行。runCommand仅仅是接受命令的文档,执行等价查询,所以drop实际调用的是db.$cmd.findone().
buildInfo 返回版本号和主机操作系统。
db.runCommand({"buildInfo":1}) { "version" : "2.6.9", "gitVersion" : "df313bc75aa94d192330cb92756fc486ea604e64", "OpenSSLVersion" : "", "sysInfo" : "Linux build20.nj1.10gen.cc 2.6.32-431.3.1.el6.x86_64 #1 SMP Fri Jan 3 21:39:27 UTC 2014 x86_64 BOOST_LIB_VERSION=1_49", "loaderFlags" : "-fPIC -pthread -Wl,-z,now -rdynamic", "compilerFlags" : "-Wnon-virtual-dtor -Woverloaded-virtual -fPIC -fno-strict-aliasing -ggdb -pthread -Wall -Wsign-compare -Wno-unknown-pragmas -Winvalid-pch -pipe -Werror -O3 -Wno-unused-function -Wno-deprecated-declarations -fno-builtin-memcmp", "allocator" : "tcmalloc", "versionArray" : [ 2, 6, 9, 0 ], "javascriptEngine" : "V8", "bits" : 64, "debug" : false, "maxBsonObjectSize" : 16777216, "ok" : 1
collStats 返回指定集合的统计信息,包括数据大小、已分配的存储空间和索引大小。
> db.runCommand({"collStats":"zyshun"}) { "ns" : "test.zyshun", "count" : 6, "size" : 800, "avgObjSize" : 133, "storageSize" : 8192, "numExtents" : 1, "nindexes" : 1, "lastExtentSize" : 8192, "paddingFactor" : 1, "systemFlags" : 1, "userFlags" : 1, "totalIndexSize" : 8176, "indexSizes" : { "_id_" : 8176 }, "ok" : 1 }
distinct 列出指定键满足条件的去重值。
> db.runCommand({"distinct":"zyshun","key":"_id","query":{"age":{"$gte":0}}}) { "values" : [ ObjectId("5602455af303d2986f20ad43"), ObjectId("56024ad9f303d2986f20ad45"), ObjectId("56025705f303d2986f20ad49") ], "stats" : { "n" : 3, "nscanned" : 6, "nscannedObjects" : 6, "timems" : 0, "cursor" : "BasicCursor" }, "ok" : 1 }
drop 删除集合的所有数据
{"drop":collection}
dropDatabase 删除当前数据库的所有数据
{"dropDatabase":1}
dropIndexes 删除集合里面的索引
{"dropIndexes":collection,"index":name}
- findAndModify 修改数据
getLastError 查看本集合执行的最后一次操作的错误信息或者其他状态信息
{"getLastError":1[,"w":w[,"wtimeout":timeout]]}
isMaster 检查本服务器是主还是从
> db.runCommand({"isMaster":1}) { "ismaster" : true, "maxBsonObjectSize" : 16777216, "maxMessageSizeBytes" : 48000000, "maxWriteBatchSize" : 1000, "localTime" : ISODate("2015-09-24T07:19:19.781Z"), "maxWireVersion" : 2, "minWireVersion" : 0, "ok" : 1 }
- listCommand 返回所有可以在服务器上运行的命令及相关信息。
- listDatabases 列出服务器上所有的数据库
- ping 检查服务器链接是否正常
- renamCollection 将集合A重命名为集合B,其中集合的名称,必须是完整的集合命名空间。
repaireDatabase 修复并压缩当前的数据库,这个操作要慎重,可能非常耗时。
> db.runCommand({"repairDatabase":1}) { "ok" : 1 }
- serverStatus 返回这台服务器的管理统计信息。
以上是一小部分命令
固定集合
MongoDB的普通集合在数据增长的时候会自动调整大小,MongoDB还支持建立另外一种集合–固定集合,事先创建,固定大小。如果向一个空间用尽的固定集合插入数据,那么集合会将最早的文档删除来为新的文档提供空间。意味着固定大小的文档通过删除最早的文档来为新文档提供空间。固定集合和普通集合有一个区别,就是固定集合默认情况下没有索引,即便是_id上也没有索引。
固定集合的功能与限制合一,对固定集合插入速度极快,做插入操作的时候无需额外分配空间,服务器也不必查找空闲的列表来防止文档,直接将文档插入集合末尾即可。由于固定集合的特性,如果按照插入顺序输出数据,查询速度极快。MongoDB设计固定集合的目的是用来存储内部的复制日志oplog。
创建固定集合语法
db.createCollection("collection_name",{capped:true,size:100000});
> db.createCollection("capcoll",{capped:true,size:100000});
{ "ok" : 1 }
也可以通过控制参数max来限制文档的数量。也可以通过命令将普通集合转换为固定集合。
> db.runCommand({convertToCapped:"zytt",size:10000});
{ "ok" : 1 }
固定集合有种特殊的排序方式,叫做自然排序,自然顺序就是文档在磁盘上的顺序。可以使用参数sort({“$natural”:-1})自然排序的反向排序。
尾部游标
尾部游标是一种特殊的持久游标,这类游标不会在没有结果后销毁。尽可能的持续地获取结果输出,在没有结果游标也不会销毁,一旦有新文档添加到集合里面就会被取回并输出,尾部游标只能在固定集合上。MongoDB并不支持尾部游标。
GridFS:存储大文件
GridFS
是一种MongoDB中存储大的二进制文件的机制
- MongoDB使用GridFS存储二进制文件,就不需要使用独立的文件存储架构
- GridFS可以利用复制和分片,更利于扩展
- 避免用户上传文件出现问题
- 不产生磁盘碎片,因为MongoDB分配数据文件是以2GB为一块。
GridFS是一个建立在普通MongoDB文档基础上的轻量级文件存储规范,MongoDB对于GridFS的请求没有任何的照顾。其思想就是可以讲将大文件分成很多块,每块作为一个单独的文档存储,这样就可以存大文件。由于MongoDB允许文档存储二进制数据,可以最大限度的减小数据块的存储开销,除了存储文件本身的数据块还会有一个单独的文档用来存储分块的信息和文件的元数据。
服务器端脚本
在服务器端可以通过db.eval函数来执行JavaScript脚本。也可以把JavaScript脚本保存在数据库中,然后在别的数据库中调用。
数据库引用
DBRef,数据库引用,这可能是MongoDB最少用到的功能,DBRef是一个内嵌的文档,就像MongoDB中的其他内嵌文档一样。但是DBRef有些必选键,{"$ref":connection,"$id":id_value}
,其中$ref
指向一个集合,$id
的id_value用来在集合里根据_id确定唯一的文档。通过制定collection和_id可以确定集合内的唯一文档。若要引用另一个数据库,可以通过$db
指定。