1. 程式人生 > >MongoDB Shell API 點滴

MongoDB Shell API 點滴

      Mongo shell是一款很不錯的javascript解析器,它除了支援javascript的標準API之外,還擴充套件了用於操作MongoDB服務的API(shell內部API), 就好比瀏覽器一樣,擴充套件了DOM、BOM、DHTM等等相關的API。shell在啟動後,會去載入內部實現,給使用者提供方法介面。shell內部API的實現在shell/collection.js、shell/db.js、shell/mongo.js、shell/mr.js、shell/query.js、shell/servers.js、shell/utils.js、shell/utils_sh.js等檔案裡,下面就來介紹下各個檔案裡的方法的作用。


shell/servers.js 這個檔案主要是提供對MongoDB服務的操作,如啟動一個MongoDB、Mongos服務,並返回服務連線物件(Mongo例項)
_parsePath(args):該方法是全域性方法,接收命令列引數,返回dbpath路徑。 eg:_parsePath("--dbpath","/data/db") 可以接收多個引數。
_parsePort(args):該方法是全域性方法,接收命令列引數,返回服務埠。eg:_parsePort("--port",10000)  引數格式不對的話,會報異常。
createMongoArgs (binaryName,args) :binary是可執行(mongod、mongos),args是命令列引數,數組裡只有一個元素時,元素是個object,各個屬性和值就命令列引數
startMongodTest(port,dirname,restart,extraOptions):啟動一個測試版的Mongod服務,返回連結(Mongo例項,超時為10分鐘)。port為埠(預設為27000),dirname為資料庫目錄名(預設為埠號),restart不存在則啟動服務時,會清空資料庫目錄內容(目錄不存在則建立),反之則以普通方式啟動服務(非副本集),extraOptions為啟動服務引數。
startMongodEmpty(args):啟動一個普通服務,返回Mongo例項。啟動時會清空資料庫目錄內容,目錄不存在則建立。
getHostName():取得本機名
resetDbpath(dbpath):目錄存在,則清空目錄裡的內容;不存在,則建立目錄。
startMongod(args):啟動mongod服務,返回Mongo例項。內部呼叫的是startMongodEmpty
startMongodNoReset(args):啟動服務,返回Mongo例項。不會清空資料庫目錄內容
startMongos(args):啟動路由服務,返回Mongo例項.
startMongoProgram(args):啟動一個Mongod、Mongos例項,返回Mongo例項。args為啟動引數,需要注意的是引數陣列第一個引數必須是可執行命令(mongod,mongos)
startMongoProgramNoConnect(args):啟動一個mongo shell 例項,返回子程序PID。args為啟動引數。eg:startMongoProgramNoConnect("mongo","--nodb")
_startMongoProgram(args):根據命令引數啟動服務或客戶端。啟動服務介面最終都是通過這個內建介面啟動。
myPort():返回當前shell連結的服務埠。
stopMongoProgram(port):停掉服務。
stopMongod(port):停掉服務。
MongodRunner:服務啟動器類
MongodRunner.prototype.start(reuseData ):啟動服務,啟動過程會去刪除lock檔案。reuseData存在時,按普通方式啟動,不會清空資料庫目錄下的內容,不存在時,執行startMongod
MongodRunner.prototype.port():取得服務埠
MongodRunner.prototype.toString():返回啟動器引數串。
ToolTest(name):普通服務測試類,name會被對映成資料庫目錄名,預設路徑為/data/db,埠號為31000
ToolTest.prototype.startDB(coll):啟動服務,coll存在時返回指定的集合,不存在的話,返回DB例項。啟動過程中不會啟動web服務
removeFile(filename):刪除指定檔案。
ToolTest.prototype.stop:停掉測試服務
ToolTest.prototype.runTool(args):指定引數,啟動服務,返回Mongo例項。
ReplTest(name,ports):主從服務測試類。name會被對映成資料庫目錄名,預設路徑為/data/db/。ports[0]為主介面,ports[1]為從介面
ReplTest.prototype.getPort(master):返回主或從介面
ReplTest.prototype.getPath(master):返回主或從資料庫目錄路徑
ReplTest.prototype.getOptions(master,extra,putBinaryFirst,norepl):取得主或從服務啟動時完整的命令陣列
ReplTest.prototype.start(master,options,restart,norepl):啟動主或從服務,返回Mongo例項。restart存在時,不會清除資料庫目錄下的內容,反之則為之。
ReplTest.prototype.stop(master,signal):停掉服務。singal預設為15
allocatePorts(n,startPort):返回[31000...31000+n-1]
quit(int):退出客戶端
waitProgram(pid)
sleep(num):休眠函式,休眠一段時間後,在往下執行。時間是毫秒。




shell/collection.js 這個檔案是DBCollection類和MapReduceResult類的封裝,管理著集合資訊。下面就來看看這個檔案裡都有哪些操作。
DBCollection(mongo,db,shortName,fullName):構造器。引數分別是Mongo例項,DB例項,集合名,集合完整名稱。DBCollection例項的屬性分別為_mongo,_db,_shortName,_fullName
DBCollection.prototype.verify:校驗例項各個屬性是否存在,DBCollection例項化時會呼叫,所以例項化時,引數不對會報異常。
DBCollection.prototype.getName:返回_shortName
DBCollection.prototype.help:打出幫助資訊,提示DBCollection支援哪些操作。
DBCollection.prototype.getFullName:返回_fullName
DBCollection.prototype.getMongo:返回_db.getMongo()
DBCollection.prototype.getDB:返回_db
DBCollection.prototype._dbCommand(cmd,param):命令執行,返回執行結果
DBCollection.prototype.runCommand:等同_dbCommand
DBCollection.prototype._massageObject(q):返回查詢物件
DBCollection.prototype._validateObject(o):驗證物件是不是一個DBQuery Object.不是的話會拋異常
DBCollection._allowedFields:設定預設能顯示的欄位。這裡預設是{ $id : 1 , $ref : 1 }
DBCollection.prototype._validateForStorage(o):驗證物件(文件)能否儲存,比如物件裡含有系統的關鍵字時。
DBCollection.prototype.find(query,fields,limit,skip):查詢
DBCollection.prototype.findOne(query,fields):查詢滿足條件的第一條記錄。
DBCollection.prototype.insert(obj,_allow_dot):插入。_allow_dot存在時,不會去驗證obj的格式能否儲存(內容是否含有保留字)
DBCollection.prototype.remove(q,justOne):刪除文件。justOne存在時,刪除滿足條件的第一條記錄
DBCollection.prototype.update(query,obj,upsert,multi):更新操作。
DBCollection.prototype.save(obj):儲存操作,根據_id查詢,存在就修改,不存在就新增
DBCollection.prototype._genIndexName(keys):取得索引名字(根據文件構造索引名)
DBCollection.prototype._indexSpec(key,options):返回組織夠搞好的用於建立索引的引數
DBCollection.prototype.createIndex(key,options):建立索引
DBCollection.prototype.ensureIndex(key,options):建立索引
DBCollection.prototype.resetIndexCache:重置索引快取
DBCollection.prototype.reIndex:等同db.runCommand({reIndex:集合名})
DBCollection.prototype.dropIndexes:刪除所有索引
DBCollection.prototype.drop:刪除集合,返回true,刪除成功,flase刪除失敗
DBCollection.prototype.findAndModify:upsert操作
DBCollection.prototype.renameCollection(newName,dropTarget):修改集合名字,newName是一個shortname
DBCollection.prototype.validate(full):驗證命令空間
DBCollection.prototype.getShardVersion:取得分片版本
DBCollection.prototype.getIndexes:拿到當前集合的索引集,陣列結構。
DBCollection.prototype.getIndices:同getIndexes
DBCollection.prototype.getIndexSpecs:同getIndexes
DBCollection.prototype.getIndexKeys:拿到索引的keys
DBCollection.prototype.count:返回集合裡的文件數
DBCollection.prototype.clean:刪除集合中空閒的記憶體,一般情況下,使用者都不會用,只有集合內部操作時,會去執行。
DBCollection.prototype.dropIndex(index):刪除指定索引
DBCollection.prototype.copyTo(newName):將集合裡的資料拷貝到db指定的庫下的newName集合裡。newName是一個shortName
DBCollection.prototype.getCollection(subName):拿到該集合的子集合物件。newName(是一個shortname)為子集合名.
DBCollection.prototype.stats(scale):拿到集合的一些系統資訊。
DBCollection.prototype.dataSize:拿到集合佔用的內容大小
DBCollection.prototype.storageSize:拿到集合儲存資料佔用的大小
DBCollection.prototype.totalIndexSize:拿到集合索引佔用的大小
DBCollection.prototype.totalSize:拿到集合佔用總大小。相當於dataSize、storageSize等的和
DBCollection.prototype.convertToCapped(bytes):將普通集合轉換成固定集合
DBCollection.prototype.exists:判斷構造的集合是否存在
DBCollection.prototype.isCapped:判斷集合是否是固定大小的集合
DBCollection.prototype._distinct(key,query):返回滿足查詢條件的結果集中某個key對應的值
DBCollection.prototype.distinct(key,query):同_distinct方法
DBCollection.prototype.group(condition):對應group命令操作
DBCollection.prototype.groupcmd:同group方法


MapReduceResult(db,o):構造器
MapReduceResult.prototype._simpleKeys:返回構造引數o
MapReduceResult.prototype.find(args):返回查詢結果
MapReduceResult.prototype.drop:刪除結果集
MapReduceResult.prototype.convertToSingleObject:此方法只提供給debug時用。一般情況下,使用者應用不會用到。
DBCollection.prototype.convertToSingleObject(valuefield):查詢集合裡的文件內容,然後遍歷文件。將文件集儲存在一個Object物件裡。結構如:z={},z[a._id]=a[valuefield],返回z。
DBCollection.prototype.mapReduce(map,reduce,optionsOrOutString):執行mapreduce操作,返回一個MapReduceResult例項
DBCollection.prototype.toString:返回fullname
DBCollection.prototype.tojson:同toString
DBCollection.prototype.shellPrint:同toString
DBCollection.autocomplete(obj):設定集合自動補全功能,內部使用。在shell控制檯中輸入類似"db."後,按"tab"鍵自動補全功能。


note:研究過程發現Mongo shell的js引擎在判斷DB或DBCollection的屬性是否存在時,永遠都返回真。個人覺得,它對DB例項做了特殊處理:如果物件是DB例項,且屬性不存在的話,則給物件建立這個屬性,值為DBCollection例項(相當於建立了一個臨時集合,服務端還沒有持久化),反之是其他物件(自定義)的話,會走標準的javascript解析(返回undefined)


shell/db.js,這個檔案是DB類的封裝,管理DB的一些操作,下面來簡要說說各個方法的用處。
DB(mongo,name):構造器。mongo為Mongo例項,name為資料庫名
DB.prototype.getMongo:返回mongo例項_mongo
DB.prototype.getSiblingDB(name):拿到其他DB,name:指定的資料庫名。
DB.prototype.getSisterDB:同getSiblingDB
DB.prototype.getName:返回資料庫名_name
DB.prototype.stats:返回該資料庫的系統資訊,如這個庫的佔用空間。
DB.prototype.getCollection(name):取得指定的集合物件
DB.prototype.commandHelp(name):命令幫助,檢視命令使用方式。name:命令名,如name:"findandmodify"
DB.prototype.runCommand(obj):執行命令,返回object物件。obj為命令引數,
DB.prototype._dbCommand:同runCommand
DB.prototype.adminCommand():admin許可權執行命令
DB.prototype._adminCommand:同adminCommand
DB.prototype.addUser(user,pass,readonly):給資料庫新增使用者。readonly預設是false
hex_md5(args):生成md5碼
DB.prototype.removeUser(username):刪除使用者
DB.prototype.__pwHash(nonce,username,pass):根據引數進行md5編碼。具體可以檢視方法的實現。一般是給內部使用。
DB.prototype.auth(username,pass):驗證這個使用者及口令是否合法。返回1合法。返回0不合法,也就是使用者或口令錯誤。
DB.prototype.createCollection(name,opt):手動建立集合(可建立固定集合),返回object。一般情況下都是自動建立集合。自動建立集合在沒有對集合執行insert等操作時,集合只是在客戶端快取,服務端並沒有持久化。手動建立的話,則會持久化到服務端
DB.prototype.getProfilingLevel:檔案級別
DB.prototype.getProfilingStatus:檔案狀態。不建議使用
DB.prototype.dropDatabase:刪除當前資料庫
DB.prototype.dropDatabase:刪除資料庫
DB.prototype.shutdownServer:關閉服務。需要admin資料庫下執行
DB.prototype.cloneDatabase(from):從另一個server中拷貝資料庫,一般不建議使用。用的話,通常是先執行dropDatabase()。eg:use tt db.cloneDatabase("localhost:10000")
DB.prototype.cloneCollection(from,collection,query):從另一個server拷貝集合中資料。collection為集合名,query為查詢條件。一般情況下是先執行drop()
DB.prototype.copyDatabase(fromdb,todb,fromhost,username,password):資料庫備份。建議使用。這個需要admin許可權執行。fromhost未指定的話,就從本機拷貝
DB.prototype.repairDatabase:修復資料庫
DB.prototype.help:列印DB例項支援的方法。
DB.prototype.printCollectionStats:列印當前資料庫集合的一些系統狀態資訊,如記憶體開銷。
DB.prototype.setProfilingLevel(level,slowns):設定檔案級別。目前還不知道這個作用
DB.prototype.eval(jsfunction,[options]):伺服器端執行javascript。對應$eval命令
DB.prototype.dbEval(jsfunction):同DB.prototype.eval(jsfunction)
DB.prototype.groupeval(paramsObj):服務端執行
DB.prototype.groupcmd(paramsObj):group命令操作
DB.prototype.group:同groupcmd
DB.prototype._groupFixParms(paramsObj):將物件格式轉換成group接收的格式
DB.prototype.resetError:執行reseterror命令
DB.prototype.forceError:執行forceerror命令
DB.prototype.getLastError(w,wtimeout):執行getlasterror命令,返回最後一次錯誤執行的系統資訊,這些資訊裡可以看到最後一次是執行了什麼操作。
DB.prototype.getLastErrorObj(w,wtimeout):返回最後一次錯誤執行的系統資訊物件,物件裡儲存了執行的細節,執行的是什麼操作,如insert
DB.prototype.getLastErrorCmd:同getLastErrorObj
DB.prototype.getPrevError:執行getpreerror命令
DB.prototype.getCollectionNames:返回當前資料庫下有哪些集合
DB.prototype.tojson:返回資料庫名
DB.prototype.toString:返回資料庫名
DB.prototype.isMaster:執行ismaster命令,判斷當前client連結的資料庫服務是不是一個主服務
DB.prototype.currentOp:查詢當前操作,暫時還不知道使用場景
DB.prototype.killOp:具體作用可以檢視官方文件
DB.prototype.killOP:同DB.prototype.killOp
DB.tsToSeconds:改方法作用,具體可以檢視官方文件
DB.prototype.getReplicationInfo:拿到副本集資訊,該方法使用於叢集環境,不能應用於大多數資料庫,只能應用於local資料庫,具體可以檢視官方文件
DB.prototype.printReplicationInfo:列印副本集資訊
DB.prototype.printSlaveReplicationInfo:列印從服務資訊
DB.prototype.serverBuildInfo:伺服器構建資訊,執行buildinfo命令
DB.prototype.serverStatus:伺服器狀態資訊,執行serverstatus命令
DB.prototype.serverCmdLineOpts:返回服務端的命令列引數
DB.prototype.version:返回資料庫版本
DB.prototype.serverBits:檢視伺服器是32位還是64位作業系統
DB.prototype.listCommands:列出支援的命令,執行listCommands命令
DB.prototype.printShardingStatus:列印片服務的狀態資訊
DB.prototype.fsyncLock:讓資料庫同步加鎖
DB.prototype.fsyncUnlock:檢查資料庫當前是不是出於同步加鎖狀態
DB.autocomplete(obj):設定資料庫物件自動補全,內部使用。


shell/mongo.js,這個檔案是Mongo類的封裝,管理著資料庫的連結資訊,相當關係資料庫中Connection物件。下面來介紹mongo.js裡都有哪些操作。
Mongo(host):Mongo例項構造器。eg.new Mongo("127.0.0.1:3333"),埠號可選,預設為27017
Mongo.prototype.setSlaveOk:設定服務為從服務
Mongo.prototype.getDB(name):建立一個DB例項,並將例項返回。
Mongo.prototype.getDBs:返回資料庫列表,執行listDatabases命令。
Mongo.prototype.adminCommand(cmd):已admin許可權執行命令
Mongo.prototype.getDBNames:取得資料庫名集合
Mongo.prototype.getCollection(ns):根據名稱空間取得集合物件
Mongo.prototype.toString:列印物件
Mongo.prototype.tojson:同toString
connect(url,user,pass):連線伺服器,返回DB例項,預設是test資料庫的例項
Mongo.prototype.find():查詢操作,返回遊標物件。 一般情況下不會直接呼叫,
Mongo.prototype.insert():建立操作
Mongo.prototype.remove():刪除操作
Mongo.prototype.update():更新操作


note:find,insert,remove,update這幾個方法是由DBQuery物件來呼叫


shell/query.js,這個檔案是DBQuery類(遊標InternalCursor的包裝者)的封裝實現。這個類主要是組織查詢條件,最後傳送命令給服務端取得資料,作用類似於關係資料庫的statement(java)
DBQuery(mongo,db,collection,ns,query,fields,limit,skip,batchSize,options):遊標物件構造器。一般情況下是內部使用。
DBQuery.prototype.help:列印DBQuery物件支援哪些方法
DBQuery.prototype.clone:返回克隆的DBQuery物件。
DBQuery.prototype._ensureSpecial:內部使用,具體可以參照官方文件
DBQuery.prototype._checkModify:方法拋異常,就表示操作已經執行了。內部使用
DBQuery.prototype._exec:執行操作,建立遊標物件
DBQuery.prototype.limit(limit):設定limit,返回當前物件
DBQuery.prototype.batchSize(batchSize):設定批量大小,返回當前物件
DBQuery.prototype.addOption(option):新增查詢引數,返回當前物件
DBQuery.prototype.skip(skip):設定skip引數,返回當前物件
DBQuery.prototype.hasNext:執行_exec,內部呼叫遊標物件的hasNext方法來遍歷結果
DBQuery.prototype.next:執行_exec,內部呼叫遊標物件的next方法來遍歷結果
DBQuery.prototype.objsLeftInBatch:執行遊標物件的objsLeftInBatch方法
DBQuery.prototype.toArray:呼叫遊標的遍歷方法,將查詢的結果集轉換成陣列
DBQuery.prototype.count(applySkipLimit):執行命令實時返回查詢結果集的文件個數.applySkipLimit存在,則計算limit和skip
DBQuery.prototype.size:等同DBQuery.prototype.count(true)
DBQuery.prototype.countReturn:返回this.count()-skip>limit?limit:this.count()-skip,一般情況下和count()一樣。
DBQuery.prototype.itcount:測試環境下用的,根據遊標結果計算count值。
DBQuery.prototype.length:計算遊標結果集文件個數。
DBQuery.prototype._addSpecial(name,value):對query新增查詢欄位,一般情況下是給內部使用的
DBQuery.prototype.sort(sortby):按照某個欄位排序,內部執行_addSpecial,對query新增orderby條件。
DBQuery.prototype.hint(hit):對query新增"$hint"條件
DBQuery.prototype.min(min):對query新增"$min"條件
DBQuery.prototype.max(max):對query新增"$max"條件
DBQuery.prototype.showDiskLoc:對query新增"$showDiskLoc"條件
DBQuery.prototype.forEach(func):遍歷遊標結果集,將文件傳給func執行
DBQuery.prototype.map(func):遍歷遊標結果集,將文件傳給func執行,最後返回儲存func執行結果的陣列
DBQuery.prototype.arrayAccess(index):根據位置索引遊標結果集文件
DBQuery.prototype.explain:列印查詢過程中的一些系統資訊,如用到哪些索引,掃描了多少個文件等等。
DBQuery.prototype.snapshot:查詢結果是快照,對query新增"$snapshot"條件,返回當前查詢物件
DBQuery.prototype.pretty:設定DBQuery例項的_prettyShell屬性,預設為false,返回當前查詢物件,一般情況下不用
DBQuery.prototype.shellPrint:列印輸出方法。
DBQuery.prototype.toString:toString方法
DBQuery.shellBatchSize:全域性屬性,預設為20,在shellPrint方法裡用到,一般不會使用。


shell/mr.js,這個檔案是封裝mapreduce相關操作。簡要介紹下API,應用一般不會直接用到這些
MR:是Object例項
MR.init:初始化操作
MR.cleanup:重新初始化
MR.emit(k,v):做mapreduce操作時的用到emit方法
MR.doReduce:執行reduce方法
MR.check:檢查引數
MR.finalize:mapreduce執行後執行