详解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管理命令到此结束,希望本文分享能够给大家带来帮助。