详解MongoDB管理命令
MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表;而每个集合中可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由一组列标识的实体的集合对应于关系数据库表中的行。下面通过熟悉MongoDB的基本管理命令,来了解MongoDB提供的DBMS的基本功能和行为。
MongoDB命令帮助系统
在安装MongoDB后,启动服务器进程(mongod),可以通过在客户端命令mongo实现对MongoDB的管理和监控。看一下MongoDB的命令帮助系统:
root@dev:~#mongo MongoDBshellversion:.. connectingto:test >help db.help()helpondbmethods db.mycoll.help()helponcollectionmethods rs.help()helponreplicasetmethods helpconnectconnectingtoadbhelp helpadminadministrativehelp helpmiscmiscthingstoknow helpmrmapreducehelp showdbsshowdatabasenames showcollectionsshowcollectionsincurrentdatabase showusersshowusersincurrentdatabase showprofileshowmostrecentsystem.profileentrieswithtime>=ms use<db_name>setcurrentdatabase db.foo.find()listobjectsincollectionfoo db.foo.find({a:})listobjectsinfoowherea== itresultofthelastlineevaluated;usetofurtheriterate DBQuery.shellBatchSize=xsetdefaultnumberofitemstodisplayonshell exitquitthemongoshell
这是MongoDB最顶层的命令列表,主要告诉我们管理数据库相关的一些抽象的范畴:数据库操作帮助、集合操作帮助、管理帮助。如果你想了解数据库操作更详细的帮助命令,可以直接使用db.help(),如下所示:
db.help() DBmethods: db.addUser(username,password[,readOnly=false]) db.auth(username,password) db.cloneDatabase(fromhost) db.commandHelp(name)returnsthehelpforthecommand db.copyDatabase(fromdb,todb,fromhost) db.createCollection(name,{size:...,capped:...,max:...}) db.currentOp()displaysthecurrentoperationinthedb db.dropDatabase() db.eval(func,args)runcodeserver-side db.getCollection(cname)sameasdb['cname']ordb.cname db.getCollectionNames() db.getLastError()-justreturnstheerrmsgstring db.getLastErrorObj()-returnfullstatusobject db.getMongo()gettheserverconnectionobject db.getMongo().setSlaveOk()allowthisconnectiontoreadfromthenonmastermemberofareplicapair db.getName() db.getPrevError() db.getProfilingLevel()-deprecated db.getProfilingStatus()-returnsifprofilingisonandslowthreshold db.getReplicationInfo() db.getSiblingDB(name)getthedbatthesameserverasthisone db.isMaster()checkreplicaprimarystatus db.killOp(opid)killsthecurrentoperationinthedb db.listCommands()listsallthedbcommands db.printCollectionStats() db.printReplicationInfo() db.printSlaveReplicationInfo() db.printShardingStatus() db.removeUser(username) db.repairDatabase() db.resetError() db.runCommand(cmdObj)runadatabasecommand.ifcmdObjisastring,turnsitinto{cmdObj:} db.serverStatus() db.setProfilingLevel(level,<slowms>)=off=slow=all db.shutdownServer() db.stats() db.version()currentversionoftheserver db.getMongo().setSlaveOk()allowqueriesonareplicationslaveserver
对数据库进行管理和操作的基本命令,可以从上面获取到。如果想要得到更多,而且每个命令的详细用法,可以使用上面列出的db.listCommands()查询。
另一个比较基础的是对指定数据库的集合进行操作、管理和监控,可以通过查询db.mycoll.help()获取到:
db.mycoll.help() DBCollectionhelp db.mycoll.find().help()-showDBCursorhelp db.mycoll.count() db.mycoll.dataSize() db.mycoll.distinct(key)-eg.db.mycoll.distinct('x') db.mycoll.drop()dropthecollection db.mycoll.dropIndex(name) db.mycoll.dropIndexes() db.mycoll.ensureIndex(keypattern[,options])-optionsisanobjectwiththesepossiblefields:name,unique,dropDups db.mycoll.reIndex() db.mycoll.find([query],[fields])-queryisanoptionalqueryfilter.fieldsisoptionalsetoffieldstoreturn. e.g.db.mycoll.find({x:},{name:,x:}) db.mycoll.find(...).count() db.mycoll.find(...).limit(n) db.mycoll.find(...).skip(n) db.mycoll.find(...).sort(...) db.mycoll.findOne([query]) db.mycoll.findAndModify({update:...,remove:bool[,query:{},sort:{},'new':false]}) db.mycoll.getDB()getDBobjectassociatedwithcollection db.mycoll.getIndexes() db.mycoll.group({key:...,initial:...,reduce:...[,cond:...]}) db.mycoll.mapReduce(mapFunction,reduceFunction,<optionalparams>) db.mycoll.remove(query) db.mycoll.renameCollection(newName,<dropTarget>)renamesthecollection. db.mycoll.runCommand(name,<options>)runsadbcommandwiththegivennamewherethefirstparamisthecollectionname db.mycoll.save(obj) db.mycoll.stats() db.mycoll.storageSize()-includesfreespaceallocatedtothiscollection db.mycoll.totalIndexSize()-sizeinbytesofalltheindexes db.mycoll.totalSize()-storageallocatedforalldataandindexes db.mycoll.update(query,object[,upsert_bool,multi_bool]) db.mycoll.validate()-SLOW db.mycoll.getShardVersion()-onlyforusewithsharding
有关数据库和集合管理的相关命令,是最基础和最常用的,如集合查询、索引操作等。
基本命令及实例
下面通过实际的例子来演示一些常见的命令:
(一)基本命令
1、showdbs
显示当前数据库服务器上的数据库
2、usepagedb
切换到指定数据库pagedb的上下文,可以在此上下文中管理pagedb数据库以及其中的集合等
3、showcollections
显示数据库中所有的集合(collection)
4、db.serverStatus()
查看数据库服务器的状态。示例如下所示:
{ "host":"dev", "version":"..", "process":"mongod", "uptime":, "uptimeEstimate":, "localTime":ISODate("--T::.Z"), "globalLock":{ "totalTime":, "lockTime":, "ratio":., "currentQueue":{ "total":, "readers":, "writers": }, "activeClients":{ "total":, "readers":, "writers": } }, "mem":{ "bits":, "resident":, "virtual":, "supported":true, "mapped": }, "connections":{ "current":, "available": }, "extra_info":{ "note":"fieldsvarybyplatform", "heap_usage_bytes":, "page_faults": }, "indexCounters":{ "btree":{ "accesses":, "hits":, "misses":, "resets":, "missRatio":. } }, "backgroundFlushing":{ "flushes":, "total_ms":, "average_ms":., "last_ms":, "last_finished":ISODate("--T::.Z") }, "cursors":{ "totalOpen":, "clientCursors_size":, "timedOut": }, "network":{ "bytesIn":, "bytesOut":, "numRequests": }, "opcounters":{ "insert":, "query":, "update":, "delete":, "getmore":, "command": }, "asserts":{ "regular":, "warning":, "msg":, "user":, "rollovers": }, "writeBacksQueued":false, "ok": }
有时,通过查看数据库服务器的状态,可以判断数据库是否存在问题,如果有问题,如数据损坏,可以及时执行修复。
5、查询指定数据库统计信息
usefragment db.stats()
查询结果示例如下所示:
db.stats() { "db":"fragment", "collections":, "objects":, "avgObjSize":., "dataSize":, "storageSize":, "numExtents":, "indexes":, "indexSize":, "fileSize":, "ok": }
显示fragment数据库的统计信息。
6、查询指定数据库包含的集合名称列表
db.getCollectionNames()
结果如下所示:
db.getCollectionNames() [ "u", "baseSe", "bytravel", "daodao", "goeu", "lotour", "lvping", "mafengwo", "sina", "sohu", "system.indexes" ]
(二)基本DDL和DML
1、创建数据库
如果你习惯了关系型数据库,你可能会寻找相关的创建数据库的命令。在MongoDB中,你可以直接通过usedbname来切换到这个数据库上下文下面,系统会自动延迟创建该数据库,例如:
showdbs admin.GB local(empty) pagedb.GB test.GB useLuceneIndexDB switchedtodbLuceneIndexDB showdbs admin.GB local(empty) pagedb.GB test.GB db LuceneIndexDB db.storeCollection.save({'version':'.','segment':'eol'}) showdbs LuceneIndexDB.GB admin.GB local(empty) pagedb.GB test.GB
可见,在use指定数据库后,并且向指定其中的一个集合并插入数据后,数据库和集合都被创建了。
2、删除数据库
直接使用db.dropDatabase()即可删除数据库。
3、创建集合
可以使用命令db.createCollection(name,{size:...,capped:...,max:...})创建集合,示例如下所示:
4、删除集合
删除集合,可以执行db.mycoll.drop()。
5、插入更新记录
直接使用集合的save方法,如下所示:
<em>db.storeCollection.save({'version':'3.5','segment':'e3ol6'})</em>
更新记录,使用save会将原来的记录值进行覆盖实现记录更新。
6、查询一条记录
使用findOne()函数,参数为查询条件,可选,系统会随机查询获取到满足条件的一条记录(如果存在查询结果数量大于等于1)示例如下所示:
7、查询多条记录
使用find()函数,参数指定查询条件,不指定条件则查询全部记录。
8、删除记录
使用集合的remove()方法,参数指定为查询条件,示例如下所示:
db.storeCollection.remove({'version':'.'}) db.storeCollection.findOne() null
9、创建索引
可以使用集合的ensureIndex(keypattern[,options])方法,示例如下所示:
usepagedb switchedtodbpagedb db.page.ensureIndex({'title':,'url':-}) db.system.indexes.find() {"name":"_id_","ns":"pagedb.page","key":{"_id":},"v":} {"name":"_id_","ns":"pagedb.system.users","key":{"_id":},"v":} {"_id":ObjectId("efcfcaccd"),"ns":"pagedb.page","key":{"title":,"url":-},"name":"title__url_-","v":}
上述,ensureIndex方法参数中,数字1表示升序,-1表示降序。
使用db.system.indexes.find()可以查询全部索引。
10、查询索引
我们为集合建立的索引,那么可以通过集合的getIndexes()方法实现查询,示例如下所示:
db.page.getIndexes() [ { "name":"_id_", "ns":"pagedb.page", "key":{ "_id": }, "v": }, { "_id":ObjectId("efcfcaccd"), "ns":"pagedb.page", "key":{ "title":, "url":- }, "name":"title__url_-", "v": } ]
当然,如果需要查询系统中全部的索引,可以使用db.system.indexes.find()函数。
11、删除索引
删除索引给出了两个方法:
db.mycoll.dropIndex(name) db.mycoll.dropIndexes()
第一个通过指定索引名称,第二个删除指定集合的全部索引。
12、索引重建
可以通过集合的reIndex()方法进行索引的重建,示例如下所示:
usefragment db.baseSe.count()
统计结果,如下所示:
usefragment switchedtodbfragment db.baseSe.count()
上述统计了数据库fragment的baseSe集合中记录数。
14、查询并统计结果记录数
usefragment db.baseSe.find().count()
find()可以提供查询参数,然后查询并统计结果,如下所示:
15、查询指定数据库的集合当前可用的存储空间
usefragment db.baseSe.storageSize() 142564096
16、查询指定数据库的集合分配的存储空间
db.baseSe.totalSize() 144096000
上述查询结果中,包括为集合(数据及其索引存储)分配的存储空间。
(三)启动与终止
1、正常启动
mongod--dbpath/usr/mongo/data--logfile/var/mongo.log
说明:
指定数据存储目录和日志目录,如果采用安全认证模式,需要加上--auth选项,如:
mongod--auth--dbpath/usr/mongo/data--logfile/var/mongo.log
2、以修复模式启动
mongod--repair
以修复模式启动数据库。
实际很可能数据库数据损坏或数据状态不一致,导致无法正常启动MongoDB服务器,根据启动信息可以看到需要进行修复。或者执行:
mongod-f/etc/mongodb.conf--repair
3、终止服务器进程
db.shutdownServer()
终止数据库服务器进程。或者,可以直接kill掉mongod进程即可。
(四)安全管理
1、以安全认证模式启动
mongod--auth--dbpath/usr/mongo/data--logfile/var/mongo.log
使用--auth选项启动mongod进程即可启用认证模式。
或者,也可以修改/etc/mongodb.conf,设置auth=true,重启mongod进程。
2、添加用户
db.addUser("admin",",%F23_kj~00Opoo0+\/")
添加数据库用户,添加成功,则显示结果如下所示:
db.auth("admin",",%F23_kj~00Opoo0+\/")
数据库安全认证。认证成功显示结果:
{ "user":"admin", "readOnly":false, "pwd":"debfcbabbecd" }
如果是认证用户,执行某些命令,可以看到正确执行结果,如下所示:
4、为数据库写数据(同步到磁盘)加锁
db.runCommand({fsync:1,lock:1})
说明:
该操作已经对数据库上锁,不允许执行写数据操作,一般在执行数据库备份时有用。执行命令,结果示例如下:
5、查看当前锁状态
db.currentOp()
说明:
查询结果如下所示:
6、解锁
useadmin db.$cmd.sys.unlock.findOne()
说明:
执行解锁,结果如下所示:
db.currentOp()
状态信息如下:
(五)数据备份、恢复与迁移管理
1、备份全部数据库
mkdirtestbak cdtestbak mongodump
说明:默认备份目录及数据文件格式为./dump/[databasename]/[collectionname].bson
2、备份指定数据库
mongodump-dpagedb
说明:备份数据库pagedb中的数据。
3、备份一个数据库中的某个集合
mongodump-dpagedb-cpage
说明:备份数据库pagedb的page集合。
4、恢复全部数据库
cdtestbak mongorestore--drop
说明:将备份的所有数据库恢复到数据库,--drop指定恢复数据之前删除原来数据库数据,否则会造成回复后的数据中数据重复。
5、恢复某个数据库的数据
cdtestbak mongorestore-dpagedb--drop
说明:将备份的pagedb的数据恢复到数据库。
6、恢复某个数据库的某个集合的数据
cdtestbak mongorestore-dpagedb-cpage--drop
说明:将备份的pagedb的的page集合的数据恢复到数据库。
7、向MongoDB导入数据
mongoimport-dpagedb-cpage--typecsv--headerline--drop<csvORtsvFile.csv
说明:将文件csvORtsvFile.csv的数据导入到pagedb数据库的page集合中,使用cvs或tsv文件的列名作为集合的列名。需要注意的是,使用--headerline选项时,只支持csv和tsv文件。
--type支持的类型有三个:csv、tsv、json
其他各个选项的使用,可以查看帮助:
mongoexport-dpagedb-cpage-q{}-f_id,title,url,spiderName,pubDate--csv>pages.csv
说明:将pagedb数据库中page集合的数据导出到pages.csv文件,其中各选项含义:
-f指定cvs列名为_id,title,url,spiderName,pubDate
-q指定查询条件
其他各个选项的使用,可以查看帮助:
如果上面的选项-q指定一个查询条件,需要使用单引号括起来,如下所示:
否则,就会出现下面的错误:
1、基于mongo实现远程连接
当你已经连接到一个远程的MongoDB数据库服务器(例如,通过mongo连接到192.168.0.184),现在想要在这个会话中连接另一个远程的数据库服务器(192.168.0.197),可以执行如下命令:
如果启用了安全认证模式,可以在获取数据库连接实例时,指定认证账号.
好了,本文给大家介绍的MongoDB管理命令到此结束,希望本文分享能够给大家带来帮助。