MongoDB是一个NoSQL数据库系统:一个数据库可以包含多个集合(Collection),每个集合对应于关系数据库中的表;而每个集合中可以存储一组由列标识的记录,列是可以自由定义的,非常灵活,由一组列标识的实体的集合对应于关系数据库表中的行。下面通过熟悉MongoDB的基本管理命令,来了解MongoDB提供的DBMS的基本功能和行为。
MongoDB命令帮助系统
在安装MongoDB后,启动服务器进程(mongod),可以通过在客户端命令mongo实现对MongoDB的管理和监控。看一下MongoDB的命令帮助系统:
- root@dev2:~#
mongo - MongoDB
shell version: 1.8.3 - connecting
to: test - >
help -
db.help() help on db methods -
db.mycoll.help() help on collection methods -
rs.help() help on replica set methods -
help connect connecting to a db help -
help admin administrative help -
help misc misc things to know -
help mr mapreduce help -
-
show dbs show database names -
show collections show collections in current database -
show users show users in current database -
show profile show most recent system.profile entries with time >= 1ms -
use set current database -
db.foo.find() list objects in collection foo -
db.foo.find( { a : 1 } ) list objects in foo where a == 1 -
it result of the last line evaluated; use to further iterate -
DBQuery.shellBatchSize = x set default number of items to display on shell -
exit quit the mongo shell
- >
db.help() - DB
methods: -
db.addUser(username, password[, readOnly=false]) -
db.auth(username, password) -
db.cloneDatabase(fromhost) -
db.commandHelp(name) returns the help for the command -
db.copyDatabase(fromdb, todb, fromhost) -
db.createCollection(name, { size : ..., capped : ..., max : ... } ) -
db.currentOp() displays the current operation in the db -
db.dropDatabase() -
db.eval_r(func, args) run code server-side -
db.getCollection(cname) same as db['cname'] or db.cname -
db.getCollectionNames() -
db.getLastError() - just returns the err msg string -
db.getLastErrorObj() - return full status object -
db.getMongo() get the server connection object -
db.getMongo().setSlaveOk() allow this connection to read from the nonmaster member of a replica pair -
db.getName() -
db.getPrevError() -
db.getProfilingLevel() - deprecated -
db.getProfilingStatus() - returns if profiling is on and slow threshold -
db.getReplicationInfo() -
db.getSiblingDB(name) get the db at the same server as this one -
db.isMaster() check replica primary status -
db.killOp(opid) kills the current operation in the db -
db.listCommands() lists all the db commands -
db.printCollectionStats() -
db.printReplicationInfo() -
db.printSlaveReplicationInf o() -
db.printShardingStatus() -
db.removeUser(username) -
db.repairDatabase() -
db.resetError() -
db.runCommand(cmdObj) run a database command. if cmdObj is a string, turns it into { cmdObj : 1 } -
db.serverStatus() -
db.setProfilingLevel(level,) 0=off 1=slow 2=all -
db.shutdownServer() -
db.stats() -
db.version() current version of the server -
db.getMongo().setSlaveOk() allow queries on a replication slave server
另一个比较基础的是对指定数据库的集合进行操作、管理和监控,可以通过查询db.mycoll.help()获取到:
- >
db.mycoll.help() - DBCollection
help -
db.mycoll.find().help() - show DBCursor help -
db.mycoll.count() -
db.mycoll.dataSize() -
db.mycoll.distinct( key ) - eg. db.mycoll.distinct( 'x' ) -
db.mycoll.drop() drop the collection -
db.mycoll.dropIndex(name) -
db.mycoll.dropIndexes() -
db.mycoll.ensureIndex(keypattern[,options]) - options is an object with these possible fields: name, unique, dropDups -
db.mycoll.reIndex() -
db.mycoll.find([query],[fields]) - query is an optional query filter. fields is optional set of fields to return. -
e.g. db.mycoll.find( {x:77} , {name:1, x:1} ) -
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() get DB object associated with collection -
db.mycoll.getIndexes() -
db.mycoll.group( { key : ..., initial: ..., reduce : ...[, cond: ...] } ) -
db.mycoll.mapReduce( mapFunction , reduceFunction , ) -
db.mycoll.remove(query) -
db.mycoll.renameCollection( newName , ) renames the collection. -
db.mycoll.runCommand( name , ) runs a db command with the given name where the first param is the collection name -
db.mycoll.save(obj) -
db.mycoll.stats() -
db.mycoll.storageSize() - includes free space allocated to this collection -
db.mycoll.totalIndexSize() - size in bytes of all the indexes -
db.mycoll.totalSize() - storage allocated for all data and indexes -
db.mycoll.update(query, object[, upsert_bool, multi_bool]) -
db.mycoll.validate() - SLOW -
db.mycoll.getShardVersion() - only for use with sharding
有关数据库和集合管理的相关命令,是最基础和最常用的,如集合查询、索引操作等。
基本命令及实例
下面通过实际的例子来演示一些常见的命令:
(一)基本命令
1、show dbs
- {
-
"host" : "dev2", -
"version" : "1.8.3", -
"process" : "mongod", -
"uptime" : 845446, -
"uptimeEstimate" : 839192, -
"localTime" : ISODate("2011-12-27T04:03:12.512Z"), -
"globalLock" : { -
"totalTime" : 845445636925, -
"lockTime" : 13630973982, -
"ratio" : 0.016122827283818857, -
"currentQueue" : { -
"total" : 0, -
"readers" : 0, -
"writers" : 0 -
}, -
"activeClients" : { -
"total" : 0, -
"readers" : 0, -
"writers" : 0 -
} -
}, -
"mem" : { -
"bits" : 64, -
"resident" : 12208, -
"virtual" : 466785, -
"supported" : true, -
"mapped" : 466139 -
}, -
"connections" : { -
"current" : 27, -
"available" : 792 -
}, -
"extra_info" : { -
"note" : "fields vary by platform", -
"heap_usage_bytes" : 70895216, -
"page_faults" : 17213898 -
}, -
"indexCounters" : { -
"btree" : { -
"accesses" : 4466653, -
"hits" : 4465526, -
"misses" : 1127, -
"resets" : 0, -
"missRatio" : 0.00025231420484197006 -
} -
}, -
"backgroundFlushing" : { -
"flushes" : 14090, -
"total_ms" : 15204393, -
"average_ms" : 1079.0910574875797, -
"last_ms" : 669, -
"last_finished" : ISODate("2011-12-27T04:02:28.713Z") -
}, -
"cursors" : { -
"totalOpen" : 3, -
"clientCursors_size" : 3, -
"timedOut" : 53 -
}, -
"network" : { -
"bytesIn" : 63460818650, -
"bytesOut" : 763926196104, -
"numRequests" : 67055921 -
}, -
"opcounters" : { -
"insert" : 7947057, -
"query" : 35720451, -
"update" : 16263239, -
"delete" : 154, -
"getmore" : 91707, -
"command" : 68520 -
}, -
"asserts" : { -
"regular" : 0, -
"warning" : 1, -
"msg" : 0, -
"user" : 7063866, -
"rollovers" : 0 -
}, -
"writeBacksQueued" : false, -
"ok" : 1 - }
- >
db.stats() - {
-
"db" : "fragment", -
"collections" : 12, -
"objects" : 384553, -
"avgObjSize" : 3028.40198360174, -
"dataSize" : 1164581068, -
"storageSize" : 1328351744, -
"numExtents" : 109, -
"indexes" : 10, -
"indexSize" : 16072704, -
"fileSize" : 4226809856, -
"ok" : 1 - }
- >
db.getCollectionNames() - [
-
"17u", -
"baseSe", -
"bytravel", -
"daodao", -
"go2eu", -
"lotour", -
"lvping", -
"mafengwo", -
"sina", -
"sohu", -
"system.indexes" - ]
- >
show dbs - admin
0.03125GB - local
(empty) - pagedb
0.03125GB - test
0.03125GB - >
use LuceneIndexDB - switched
to db LuceneIndexDB - >
show dbs - admin
0.03125GB - local
(empty) - pagedb
0.03125GB - test
0.03125GB - >
db - LuceneIndexDB
- >
db.storeCollection.save({'version':'3.5', 'segment':'e3ol6'}) - >
show dbs - LuceneIndexDB
0.03125GB - admin
0.03125GB - local
(empty) - pagedb
0.03125GB - test
0.03125GB - >
- >
db.createCollection('replicationColletion', {'capped':true, 'size':10240, 'max':17855200}) - {
"ok" : 1 } - >
show collections - replicationColletion
- storeCollection
- system.indexes
4、删除集合
删除集合,可以执行db.mycoll.drop()。
5、插入更新记录
直接使用集合的save方法,如下所示:
- >
db.storeCollection.save({'version':'3.5', 'segment':'e3ol6'})
更新记录,使用save会将原来的记录值进行覆盖实现记录更新。
6、查询一条记录
使用findOne()函数,参数为查询条件,可选,系统会随机查询获取到满足条件的一条记录(如果存在查询结果数量大于等于1)示例如下所示:
- >
db.storeCollection.findOne({'version':'3.5'}) - {
-
"_id" : ObjectId("4ef970f23c1fc4613425accc "), -
"version" : "3.5", -
"segment" : "e3ol6" - }
使用find()函数,参数指定查询条件,不指定条件则查询全部记录。
8、删除记录
使用集合的remove()方法,参数指定为查询条件,示例如下所示:
- >
db.storeCollection.remove({'version':'3.5'}) - >
db.storeCollection.findOne() - null
可以使用集合的ensureIndex(keypattern[,options])方法,示例如下所示:
- >
use pagedb - switched
to db pagedb - >
db.page.ensureIndex({'title':1, 'url':-1}) - >
db.system.indexes.find() - {
"name" : "_id_", "ns" : "pagedb.page", "key" : { "_id" : 1 }, "v" : 0 } - {
"name" : "_id_", "ns" : "pagedb.system.users", "key" : { "_id" : 1 }, "v" : 0} - {
"_id" : ObjectId("4ef977633c1fc4613425accd "), "ns" : "pagedb.page", "key" : {"title" : 1, "url" : -1 }, "name" : "title_1_url_-1", "v" : 0 }
使用db.system.indexes.find()可以查询全部索引。
10、查询索引
我们为集合建立的索引,那么可以通过集合的getIndexes()方法实现查询,示例如下所示:
- >
db.page.getIndexes() - [
-
{ -
"name" : "_id_", -
"ns" : "pagedb.page", -
"key" : { -
"_id" : 1 -
}, -
"v" : 0 -
}, -
{ -
"_id" : ObjectId("4ef977633c1fc4613425accd "), -
"ns" : "pagedb.page", -
"key" : { -
"title" : 1, -
"url" : -1 -
}, -
"name" : "title_1_url_-1", -
"v" : 0 -
} - ]
11、删除索引
删除索引给出了两个方法:
- db.mycoll.dropIndex(name)
- db.mycoll.dropIndexes()
12、索引重建
可以通过集合的reIndex()方法进行索引的重建,示例如下所示:
- >
db.page.reIndex() - {
-
"nIndexesWas" : 2, -
"msg" : "indexes dropped for collection", -
"ok" : 1, -
"nIndexes" : 2, -
"indexes" : [ -
{ -
"name" : "_id_", -
"ns" : "pagedb.page", -
"key" : { -
"_id" : 1 -
}, -
"v" : 0 -
}, -
{ -
"_id" : ObjectId("4ef977633c1fc4613425accd "), -
"ns" : "pagedb.page", -
"key" : { -
"title" : 1, -
"url" : -1 -
}, -
"name" : "title_1_url_-1", -
"v" : 0 -
} -
], -
"ok" : 1 - }
13、统计集合记录数
use fragment
db.baseSe.count()
统计结果,如下所示:
- >
use fragment - switched
to db fragment - >
db.baseSe.count() - 36749
14、查询并统计结果记录数
use fragment
db.baseSe.find().count()
find()可以提供查询参数,然后查询并统计结果,如下所示:
- >
use fragment - switched
to db fragment - >
db.baseSe.find().count() - 36749
15、查询指定数据库的集合当前可用的存储空间
use fragment
> db.baseSe.storageSize()
142564096
16、查询指定数据库的集合分配的存储空间
> db.baseSe.totalSize()
144096000
上述查询结果中,包括为集合(数据及其索引存储)分配的存储空间。
(三)启动与终止