目录

Database

MongDB Server 支持多数据库,出于安全考虑和方便管理,数据库之间相互独立,数据库数据分开独立存储。
MongoDB Database 包含一或多个collection, document(object)存储在collections之中,同时含有可选的安全认证方式来控制访问。

Commands

MongoDB 设计了Database Command 的概念, Command 不同于function() ,db.foo.help()列出的就是function().
DataBase Command 用于执行特殊的数据库访问操作,或者获取当前的数据库操作状态信息.

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
   

查看method封装内容

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;
     }

Privileged Commands

MongoDBZ 有一些特权命令,这些特权命令需要切换至 admin 数据库才可以执行:

example

          > use admin
          > db.runCommand("shutdown")
          未使用 admin 数据库,可使用如下命令:
          > db._adminCommand("shutdown"); 
          

获取Command 帮助信息

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

Clone Database

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 Command

fsync 用于强制将数据和metadata 写入datafile,更重要的是,它提供的锁机制使得备份变得更加容易。

Basics

强制刷新数据至datafile.

 > use admin
 > db.runCommand({fsync:1});
 

默认情况下,直到数据同步完毕后,才会返回结果。立刻返回结果,执行命令:

 > db.runCommand({fsync:1,async:true});
 

默认情况下MongoDB 每60s 刷新一次数据,要指定刷新周期,在启动mongod server时添加 –syncdelay :
example

   $ mongod --auth --syncdelay  30 &    #每30s 刷新一次数据。
   
   

Lock ,snapshot and unlock

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 所有索引
          

Last Error Commands

由于MongoDB 默认情况下的写操作 不会等待响应,因此有一组命令用于确认这些操作是否顺利执行。

getlasterror

getlasterror 命令用于检查最近一次执行的操作是否发生错误,可以采用以下方法调用它:

 > db.$cmd.findOne({getlasterror:1})
 
 or
 
 > db.runCommand("getlasterror")
 
 or
 
 > db.getLastError()
 

Use case

1getlasterror 命令对写操作非常适用,因为在mongodb中,写操作默认不会返回结果值(这样可以节省client/server 之间的切换时间),如果你想 在写操作之后取得一个返回值,可以调用getlasterror。

当你使用多个连接对MongoDB 进行写操作时,使用getlasterror来确认写入的数据已经提交到数据库非常重要,举个例子:你创建了两条连接到MongoDB 当你在“连接1”写入数据,然后从 “连接2” 读取从 “连接1“写入的数据,你可以调用在”连接1“写入数据后调用 getlasterror来确认数据已经写入, 然后就可以在连接2读取。

fsync option

getlasterror 作为fsync 的可选参数,在执行fsync时可以用于检测fsync 是否成功。

example

            > db.runCommand({getlasterror:1,fsync:true})
            { "err" : null, "n" : 0, "fsyncFiles" : 2, "ok" : 1 }
          
          

Viewing and Terminating Current Operation

查看当前连接操作

       > 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 Command

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});