MongDB Server 支持多数据库,出于安全考虑和方便管理,数据库之间相互独立,数据库数据分开独立存储。
MongoDB Database 包含一或多个collection, document(object)存储在collections之中,同时含有可选的安全认证方式来控制访问。
MongoDB 设计了Database Command 的概念, Command 不同于function() ,db.foo.help()列出的就是function().
DataBase Command 用于执行特殊的数据库访问操作,或者获取当前的数据库操作状态信息.
$cmd 在数据库中用于查询特殊命名空间,通常和findOne()结合使用,用于执行Command.
Syntax:
db.$cmd.findOne( { <commandname>: <value> [, options] } );
example: 检查Database的 profile level.
> db.$cmd.findOne({profile:1})
{ "was" : 0, "ok" : 1 }
Syntax2:
> db.runCommand({Commandname:value,[option]})
example:
> db.runCommand({profile:-1});
{
"was" : 0.0 ,
"ok" : 1.0
}
同样也可以调用封装方法getProfilingLevel()获取相同结果。
> db.getProfilingLevel()
0.0
example :查看getProfilingLevel 封装内容。
> db.getProfilingLevel
function () {
var res = this._dbCommand({profile:-1});
return res ? res.was : null;
}
or
> print (db.getProfilingLevel)
function () {
var res = this._dbCommand({profile:-1});
return res ? res.was : null;
}
MongoDBZ 有一些特权命令,这些特权命令需要切换至 admin 数据库才可以执行:
example
> use admin
> db.runCommand("shutdown")
未使用 admin 数据库,可使用如下命令:
> db._adminCommand("shutdown");
Syntax
db.commandHelp(name)
example
> db.commandHelp("datasize")
help for: datasize example: { datasize:"blog.posts", keyPattern:{x:1}, min:{x:10}, max:{x:55} }
NOTE: This command may take awhile to run
Syntax:
db.copyDatabase(fromdb, todb, fromhost) # 不支持认证
db.copyDatabase(<from_dbname>, <to_dbname>, <from_hostname>, <username>, <password>) # 支持认证
db.runCommand( { copydb : 1, fromdb : ..., todb : ..., fromhost : ... } )
example:
> db.copyDatabase("db1","db2") # 将本地数据库db1 复制为 db2
> db.runCommand({copydb:1,fromdb:"ip",todb:"ip2"}) # 同上
> db.copyDatabase("db1","db2","example.com") # 将example.com 上的数据库 db1 复制为本地数据库 db2.
> db.copyDatabase("db1","db2","example.com","username","passwd") # 带验证复制。
fsync 用于强制将数据和metadata 写入datafile,更重要的是,它提供的锁机制使得备份变得更加容易。
强制刷新数据至datafile.
> use admin
> db.runCommand({fsync:1});
默认情况下,直到数据同步完毕后,才会返回结果。立刻返回结果,执行命令:
> db.runCommand({fsync:1,async:true});
默认情况下MongoDB 每60s 刷新一次数据,要指定刷新周期,在启动mongod server时添加 –syncdelay :
example
$ mongod --auth --syncdelay 30 & #每30s 刷新一次数据。
fsync 命令支持锁机制,利用它可以对datafile创建快照,创建快照时,锁被启用,所有的写操作被阻塞,只能读取数据,
快照创建完之后,释放锁。
example
> use admin
> db.runCommand({fsync:1,lock:1}) #启用锁
{
"info" : "now locked against writes"
"ok" : 1
}
> db.currentOp() #使用CurrentOp()方法获取当前操作状态。
{
"inprog" : [ ]
"fsyncLock" : 1
}
对datafile创建快照之后,释放锁
> db.$cmd.sys.unlock.findOne();
{ "ok" : 1, "info" : "unlock requested" }
> db.currentOp()
{ "inprog" : [ ] }
ensureIndex()
example
> db.collection.find()
{ "_id" : ObjectId("4c08a27bb8fd33c9e5346684"), "ob" : 1 }
{ "_id" : ObjectId("4c08a27db8fd33c9e5346685"), "ob" : 2 }
{ "_id" : ObjectId("4c08a27fb8fd33c9e5346686"), "ob" : 3 }
为ob "区段"创建索引
> db.collection.ensureIndex({ob:1})
> db.system.indexes.find()
{ "_id" : ObjectId("4c08a3b4b8fd33c9e5346688"), "ns" : "ip.collection", "key" : { "ob" : 1 }, "name" : "ob_1" }
dropIndex()
example
>db.collection.dropIndex({ip:1})
>db.collection.dropIndexes() # 取消collection 所有索引
由于MongoDB 默认情况下的写操作 不会等待响应,因此有一组命令用于确认这些操作是否顺利执行。
getlasterror 命令用于检查最近一次执行的操作是否发生错误,可以采用以下方法调用它:
> db.$cmd.findOne({getlasterror:1})
or
> db.runCommand("getlasterror")
or
> db.getLastError()
1getlasterror 命令对写操作非常适用,因为在mongodb中,写操作默认不会返回结果值(这样可以节省client/server 之间的切换时间),如果你想
在写操作之后取得一个返回值,可以调用getlasterror。
当你使用多个连接对MongoDB 进行写操作时,使用getlasterror来确认写入的数据已经提交到数据库非常重要,举个例子:你创建了两条连接到MongoDB 当你在“连接1”写入数据,然后从 “连接2” 读取从 “连接1“写入的数据,你可以调用在”连接1“写入数据后调用 getlasterror来确认数据已经写入, 然后就可以在连接2读取。
getlasterror 作为fsync 的可选参数,在执行fsync时可以用于检测fsync 是否成功。
example
> db.runCommand({getlasterror:1,fsync:true})
{ "err" : null, "n" : 0, "fsyncFiles" : 2, "ok" : 1 }
> db.currentOp();
> // same as: db.$cmd.sys.inprog.findOne()
{ inprog: [ { "opid" : 18 , "op" : "query" , "ns" : "mydb.votes" ,
"query" : "{ score : 1.0 }" , "inLock" : 1 }
]
}
Fields:
opid :一个递增的操作ID,和 killOp()配合使用用于中止操作。
op: 当前操作类型(如查询,更新等)
ns: 当前操作的命名空间
query:当op为 query时,query后面显示查询细节。
也可以使用:
db.$cmd.sys.inprog.find()
查看所有连接正在进行的操作:
db.$cmd.sys.inprog.find( { $all : 1 }
> db.killOp(1234/*opid*/)
> // same as: db.$cmd.sys.killop.findOne({op:1234})
validate 命令用于查看collection是否有效,并且可获得collection的多项统计信息。
for example: 查看 collection 名为 foo 的状态信息。
> db.foo.validate()
{"ns" : "test.foo" , "result" : "
validate
details: 08D03C9C ofs:963c9c
firstExtent:0:156800 ns:test.foo
lastExtent:0:156800 ns:test.foo
# extents:1
datasize?:144 nrecords?:3 lastExtentSize:2816
padding:1
first extent:
loc:0:156800 xnext:null xprev:null
ns:test.foo
size:2816 firstRecord:0:1568b0 lastRecord:0:156930
3 objects found, nobj:3
192 bytes data w/headers
144 bytes data wout/headers
deletedList: 0000000100000000000
deleted: n: 1 size: 2448
nIndexes:1
test.foo.$x_1 keys:3
" , "ok" : 1 , "valid" : true , "lastExtentSize" : 2816}
同样也可以调用:
> db.$cmd.findOne({validate:"foo" } );
忽略数据扫描(但扫描索引),调用如下:
> db.$cmd.findOne({validate:"foo", scandata:true});