2019獨(dú)角獸企業(yè)重金招聘Python工程師標(biāo)準(zhǔn)>>>
MongoDB是一個(gè)NoSQL數(shù)據(jù)庫(kù)系統(tǒng):一個(gè)數(shù)據(jù)庫(kù)可以包含多個(gè)集合(Collection),每個(gè)集合對(duì)應(yīng)于關(guān)系數(shù)據(jù)庫(kù)中的表;而每個(gè)集合中可以存儲(chǔ)一組由列標(biāo)識(shí)的記錄,列是可以自由定義的,非常靈活,由一組列標(biāo)識(shí)的實(shí)體的集合對(duì)應(yīng)于關(guān)系數(shù)據(jù)庫(kù)表中的行。下面通過(guò)熟悉MongoDB的基本管理命令,來(lái)了解MongoDB提供的DBMS的基本功能和行為。
?
MongoDB命令幫助系統(tǒng)
?
在安裝MongoDB后,啟動(dòng)服務(wù)器進(jìn)程(mongod),可以通過(guò)在客戶端命令mongo實(shí)現(xiàn)對(duì)MongoDB的管理和監(jiān)控。看一下MongoDB的命令幫助系統(tǒng):
?
[plain]?view plain?copy
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?<db_name>????????????????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??這是MongoDB最頂層的命令列表,主要告訴我們管理數(shù)據(jù)庫(kù)相關(guān)的一些抽象的范疇:數(shù)據(jù)庫(kù)操作幫助、集合操作幫助、管理幫助。如果你想了解數(shù)據(jù)庫(kù)操作更詳細(xì)的幫助命令,可以直接使用db.help(),如下所示:
?
?
[plain]?view plain?copy
>?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(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.printSlaveReplicationInfo()??????????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,<slowms>)?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??對(duì)數(shù)據(jù)庫(kù)進(jìn)行管理和操作的基本命令,可以從上面獲取到。如果想要得到更多,而且每個(gè)命令的詳細(xì)用法,可以使用上面列出的db.listCommands()查詢。
?
另一個(gè)比較基礎(chǔ)的是對(duì)指定數(shù)據(jù)庫(kù)的集合進(jìn)行操作、管理和監(jiān)控,可以通過(guò)查詢db.mycoll.help()獲取到:
?
[plain]?view plain?copy
>?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?,?<optional?params>?)??????????db.mycoll.remove(query)??????????db.mycoll.renameCollection(?newName?,?<dropTarget>?)?renames?the?collection.??????????db.mycoll.runCommand(?name?,?<options>?)?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???
有關(guān)數(shù)據(jù)庫(kù)和集合管理的相關(guān)命令,是最基礎(chǔ)和最常用的,如集合查詢、索引操作等。
?
基本命令及實(shí)例
?
下面通過(guò)實(shí)際的例子來(lái)演示一些常見(jiàn)的命令:
?
(一)基本命令
?
1、show dbs
顯示當(dāng)前數(shù)據(jù)庫(kù)服務(wù)器上的數(shù)據(jù)庫(kù)
2、use pagedb
?切換到指定數(shù)據(jù)庫(kù)pagedb的上下文,可以在此上下文中管理pagedb數(shù)據(jù)庫(kù)以及其中的集合等
3、show collections
顯示數(shù)據(jù)庫(kù)中所有的集合(collection)
4、db.serverStatus() ?
查看數(shù)據(jù)庫(kù)服務(wù)器的狀態(tài)。示例如下所示:
[plain]?view plain?copy
{??????????"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??}??有時(shí),通過(guò)查看數(shù)據(jù)庫(kù)服務(wù)器的狀態(tài),可以判斷數(shù)據(jù)庫(kù)是否存在問(wèn)題,如果有問(wèn)題,如數(shù)據(jù)損壞,可以及時(shí)執(zhí)行修復(fù)。
5、查詢指定數(shù)據(jù)庫(kù)統(tǒng)計(jì)信息
use fragment
db.stats()
查詢結(jié)果示例如下所示:
[plain]?view plain?copy
>?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??}??顯示fragment數(shù)據(jù)庫(kù)的統(tǒng)計(jì)信息。
6、查詢指定數(shù)據(jù)庫(kù)包含的集合名稱列表
db.getCollectionNames()
結(jié)果如下所示:
[plain]?view plain?copy
>?db.getCollectionNames()??[??????????"17u",??????????"baseSe",??????????"bytravel",??????????"daodao",??????????"go2eu",??????????"lotour",??????????"lvping",??????????"mafengwo",??????????"sina",??????????"sohu",??????????"system.indexes"??]???
(二)基本DDL和DML
?
1、創(chuàng)建數(shù)據(jù)庫(kù)
如果你習(xí)慣了關(guān)系型數(shù)據(jù)庫(kù),你可能會(huì)尋找相關(guān)的創(chuàng)建數(shù)據(jù)庫(kù)的命令。在MongoDB中,你可以直接通過(guò)use dbname來(lái)切換到這個(gè)數(shù)據(jù)庫(kù)上下文下面,系統(tǒng)會(huì)自動(dòng)延遲創(chuàng)建該數(shù)據(jù)庫(kù),例如:
[plain]?view plain?copy
>?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??>??可見(jiàn),在use指定數(shù)據(jù)庫(kù)后,并且向指定其中的一個(gè)集合并插入數(shù)據(jù)后,數(shù)據(jù)庫(kù)和集合都被創(chuàng)建了。
2、刪除數(shù)據(jù)庫(kù)
直接使用db.dropDatabase()即可刪除數(shù)據(jù)庫(kù)。
3、創(chuàng)建集合
可以使用命令db.createCollection(name, { size : ..., capped : ..., max : ... } )創(chuàng)建集合,示例如下所示:
[plain]?view plain?copy
>?db.createCollection('replicationColletion',?{'capped':true,?'size':10240,?'max':17855200})??{?"ok"?:?1?}??>?show?collections??replicationColletion??storeCollection??system.indexes??4、刪除集合
刪除集合,可以執(zhí)行db.mycoll.drop()。
5、插入更新記錄
直接使用集合的save方法,如下所示:
?
[plain]?view plain?copy
>?<em>db.storeCollection.save({'version':'3.5',?'segment':'e3ol6'})</em>???
更新記錄,使用save會(huì)將原來(lái)的記錄值進(jìn)行覆蓋實(shí)現(xiàn)記錄更新。
6、查詢一條記錄
使用findOne()函數(shù),參數(shù)為查詢條件,可選,系統(tǒng)會(huì)隨機(jī)查詢獲取到滿足條件的一條記錄(如果存在查詢結(jié)果數(shù)量大于等于1)示例如下所示:
?
[plain]?view plain?copy
>?db.storeCollection.findOne({'version':'3.5'})??{??????????"_id"?:?ObjectId("4ef970f23c1fc4613425accc"),??????????"version"?:?"3.5",??????????"segment"?:?"e3ol6"??}??7、查詢多條記錄
?
使用find()函數(shù),參數(shù)指定查詢條件,不指定條件則查詢?nèi)坑涗洝?/p>
8、刪除記錄
使用集合的remove()方法,參數(shù)指定為查詢條件,示例如下所示:
?
[plain]?view plain?copy
>?db.storeCollection.remove({'version':'3.5'})??>?db.storeCollection.findOne()??null??9、創(chuàng)建索引
?
可以使用集合的ensureIndex(keypattern[,options])方法,示例如下所示:
?
[plain]?view plain?copy
>?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?}??上述,ensureIndex方法參數(shù)中,數(shù)字1表示升序,-1表示降序。
?
使用db.system.indexes.find()可以查詢?nèi)克饕?/p>
10、查詢索引
我們?yōu)榧辖⒌乃饕?#xff0c;那么可以通過(guò)集合的getIndexes()方法實(shí)現(xiàn)查詢,示例如下所示:
?
[plain]?view plain?copy
>?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??????????}??]??當(dāng)然,如果需要查詢系統(tǒng)中全部的索引,可以使用db.system.indexes.find()函數(shù)。
11、刪除索引
?
刪除索引給出了兩個(gè)方法:
?
[plain]?view plain?copy
db.mycoll.dropIndex(name)??db.mycoll.dropIndexes()??第一個(gè)通過(guò)指定索引名稱,第二個(gè)刪除指定集合的全部索引。
?
12、索引重建
可以通過(guò)集合的reIndex()方法進(jìn)行索引的重建,示例如下所示:
[plain]?view plain?copy
>?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、統(tǒng)計(jì)集合記錄數(shù)
use fragment
db.baseSe.count()
統(tǒng)計(jì)結(jié)果,如下所示:
?
[plain]?view plain?copy
>?use?fragment??switched?to?db?fragment??>?db.baseSe.count()??36749??上述統(tǒng)計(jì)了數(shù)據(jù)庫(kù)fragment的baseSe集合中記錄數(shù)。
14、查詢并統(tǒng)計(jì)結(jié)果記錄數(shù)
?
?
use fragment
db.baseSe.find().count()
find()可以提供查詢參數(shù),然后查詢并統(tǒng)計(jì)結(jié)果,如下所示:
?
[plain]?view plain?copy
>?use?fragment??switched?to?db?fragment??>?db.baseSe.find().count()??36749??上述執(zhí)行先根據(jù)查詢條件查詢結(jié)果,然后統(tǒng)計(jì)了查詢數(shù)據(jù)庫(kù)fragment的baseSe結(jié)果記錄集合中記錄數(shù)。
15、查詢指定數(shù)據(jù)庫(kù)的集合當(dāng)前可用的存儲(chǔ)空間
use fragment
> db.baseSe.storageSize()
142564096
16、查詢指定數(shù)據(jù)庫(kù)的集合分配的存儲(chǔ)空間
> db.baseSe.totalSize()
144096000
上述查詢結(jié)果中,包括為集合(數(shù)據(jù)及其索引存儲(chǔ))分配的存儲(chǔ)空間。
?
(三)啟動(dòng)與終止
?
1、正常啟動(dòng)
mongod --dbpath /usr/mongo/data --logfile /var/mongo.log
說(shuō)明:
指定數(shù)據(jù)存儲(chǔ)目錄和日志目錄,如果采用安全認(rèn)證模式,需要加上--auth選項(xiàng),如:
mongod --auth --dbpath /usr/mongo/data --logfile /var/mongo.log?
2、以修復(fù)模式啟動(dòng)
mongod?--repair
以修復(fù)模式啟動(dòng)數(shù)據(jù)庫(kù)。
實(shí)際很可能數(shù)據(jù)庫(kù)數(shù)據(jù)損壞或數(shù)據(jù)狀態(tài)不一致,導(dǎo)致無(wú)法正常啟動(dòng)MongoDB服務(wù)器,根據(jù)啟動(dòng)信息可以看到需要進(jìn)行修復(fù)。或者執(zhí)行:
mongod -f /etc/mongodb.conf --repair
3、終止服務(wù)器進(jìn)程
db.shutdownServer()
終止數(shù)據(jù)庫(kù)服務(wù)器進(jìn)程。或者,可以直接kill掉mongod進(jìn)程即可。
?
(四)安全管理
?
1、以安全認(rèn)證模式啟動(dòng)
mongod --auth --dbpath /usr/mongo/data --logfile /var/mongo.log
使用--auth選項(xiàng)啟動(dòng)mongod進(jìn)程即可啟用認(rèn)證模式。
或者,也可以修改/etc/mongodb.conf,設(shè)置auth=true,重啟mongod進(jìn)程。
2、添加用戶
db.addUser("admin", ",%F23_kj~00Opoo0+\/")
添加數(shù)據(jù)庫(kù)用戶,添加成功,則顯示結(jié)果如下所示:
[plain]?view plain?copy
{??????????"user"?:?"admin",??????????"readOnly"?:?false,??????????"pwd"?:?"995d2143e0bf79cba24b58b3e41852cd"??}??3、安全認(rèn)證
db.auth("admin", ",%F23_kj~00Opoo0+\/")
數(shù)據(jù)庫(kù)安全認(rèn)證。認(rèn)證成功顯示結(jié)果:
[plain]?view plain?copy
{??????????"user"?:?"admin",??????????"readOnly"?:?false,??????????"pwd"?:?"995d2143e0bf79cba24b58b3e41852cd"??}??如果是認(rèn)證用戶,執(zhí)行某些命令,可以看到正確執(zhí)行結(jié)果,如下所示:
[plain]?view plain?copy
db.system.users.find()??{?"_id"?:?ObjectId("4ef940a13c1fc4613425acc8"),?"user"?:?"admin",?"readOnly"?:?false,?"pwd"?:?"995d2143e0bf79cba24b58b3e41852cd"?}??否則,認(rèn)證失敗,則執(zhí)行相關(guān)命令會(huì)提示錯(cuò)誤:
[plain]?view plain?copy
db.system.users.find()??error:?{??????????"$err"?:?"unauthorized?db:admin?lock?type:-1?client:127.0.0.1",?"code"?:?10057??}??4、為數(shù)據(jù)庫(kù)寫(xiě)數(shù)據(jù)(同步到磁盤(pán))加鎖
db.runCommand({fsync:1,lock:1})
說(shuō)明:
該操作已經(jīng)對(duì)數(shù)據(jù)庫(kù)上鎖,不允許執(zhí)行寫(xiě)數(shù)據(jù)操作,一般在執(zhí)行數(shù)據(jù)庫(kù)備份時(shí)有用。執(zhí)行命令,結(jié)果示例如下:
[plain]?view plain?copy
{??????????"info"?:?"now?locked?against?writes,?use?db.$cmd.sys.unlock.findOne()?to?unlock",??????????"ok"?:?1??}??5、查看當(dāng)前鎖狀態(tài)
db.currentOp()
說(shuō)明:
查詢結(jié)果如下所示:
[plain]?view plain?copy
{??????????"inprog"?:?[?],??????????"fsyncLock"?:?1,??????????"info"?:?"use?db.$cmd.sys.unlock.findOne()?to?terminate?the?fsync?write/snapshot?lock"??}??其中,fsyncLock為1表示MongoDB的fsync進(jìn)程(負(fù)責(zé)將寫(xiě)入改變同步到磁盤(pán))不允許其他進(jìn)程執(zhí)行寫(xiě)數(shù)據(jù)操作
6、解鎖
use admin
db.$cmd.sys.unlock.findOne()
說(shuō)明:
執(zhí)行解鎖,結(jié)果如下所示:
[plain]?view plain?copy
{?"ok"?:?1,?"info"?:?"unlock?requested"?}??可以執(zhí)行命令查看鎖狀態(tài):
db.currentOp()
狀態(tài)信息如下:
[plain]?view plain?copy
{?"inprog"?:?[?]?}??說(shuō)明當(dāng)前沒(méi)有鎖,可以執(zhí)行寫(xiě)數(shù)據(jù)操作。
?
(五)數(shù)據(jù)備份、恢復(fù)與遷移管理
?
1、備份全部數(shù)據(jù)庫(kù)
mkdir testbak
cd testbak
mongodump
說(shuō)明:默認(rèn)備份目錄及數(shù)據(jù)文件格式為./dump/[databasename]/[collectionname].bson
2、備份指定數(shù)據(jù)庫(kù)
mongodump -d pagedb
說(shuō)明:備份數(shù)據(jù)庫(kù)pagedb中的數(shù)據(jù)。
3、備份一個(gè)數(shù)據(jù)庫(kù)中的某個(gè)集合
mongodump -d pagedb -c page
說(shuō)明:備份數(shù)據(jù)庫(kù)pagedb的page集合。
4、恢復(fù)全部數(shù)據(jù)庫(kù)
cd testbak
mongorestore --drop
說(shuō)明:將備份的所有數(shù)據(jù)庫(kù)恢復(fù)到數(shù)據(jù)庫(kù),--drop指定恢復(fù)數(shù)據(jù)之前刪除原來(lái)數(shù)據(jù)庫(kù)數(shù)據(jù),否則會(huì)造成回復(fù)后的數(shù)據(jù)中數(shù)據(jù)重復(fù)。
5、恢復(fù)某個(gè)數(shù)據(jù)庫(kù)的數(shù)據(jù)
cd testbak
mongorestore -d pagedb --drop
說(shuō)明:將備份的pagedb的數(shù)據(jù)恢復(fù)到數(shù)據(jù)庫(kù)。
6、恢復(fù)某個(gè)數(shù)據(jù)庫(kù)的某個(gè)集合的數(shù)據(jù)
cd testbak
mongorestore -d pagedb -c page --drop
說(shuō)明:將備份的pagedb的的page集合的數(shù)據(jù)恢復(fù)到數(shù)據(jù)庫(kù)。
7、向MongoDB導(dǎo)入數(shù)據(jù)
mongoimport -d pagedb -c page --type csv --headerline --drop < csvORtsvFile.csv
說(shuō)明:將文件csvORtsvFile.csv的數(shù)據(jù)導(dǎo)入到pagedb數(shù)據(jù)庫(kù)的page集合中,使用cvs或tsv文件的列名作為集合的列名。需要注意的是,使用--headerline選項(xiàng)時(shí),只支持csv和tsv文件。
--type支持的類型有三個(gè):csv、tsv、json
其他各個(gè)選項(xiàng)的使用,可以查看幫助:
[plain]?view plain?copy
mongoimport?--help??options:????--help??????????????????produce?help?message????-v?[?--verbose?]????????be?more?verbose?(include?multiple?times?for?more????????????????????????????verbosity?e.g.?-vvvvv)????-h?[?--host?]?arg???????mongo?host?to?connect?to?(?<set?name>/s1,s2?for?sets)????--port?arg??????????????server?port.?Can?also?use?--host?hostname:port????--ipv6??????????????????enable?IPv6?support?(disabled?by?default)????-u?[?--username?]?arg???username????-p?[?--password?]?arg???password????--dbpath?arg????????????directly?access?mongod?database?files?in?the?given????????????????????????????path,?instead?of?connecting?to?a?mongod??server?-????????????????????????????needs?to?lock?the?data?directory,?so?cannot?be?used????????????????????????????if?a?mongod?is?currently?accessing?the?same?path????--directoryperdb????????if?dbpath?specified,?each?db?is?in?a?separate????????????????????????????directory????-d?[?--db?]?arg?????????database?to?use????-c?[?--collection?]?arg?collection?to?use?(some?commands)????-f?[?--fields?]?arg?????comma?separated?list?of?field?names?e.g.?-f?name,age????--fieldFile?arg?????????file?with?fields?names?-?1?per?line????--ignoreBlanks??????????if?given,?empty?fields?in?csv?and?tsv?will?be?ignored????--type?arg??????????????type?of?file?to?import.??default:?json?(json,csv,tsv)????--file?arg??????????????file?to?import?from;?if?not?specified?stdin?is?used????--drop??????????????????drop?collection?first????--headerline????????????CSV,TSV?only?-?use?first?line?as?headers????--upsert????????????????insert?or?update?objects?that?already?exist????--upsertFields?arg??????comma-separated?fields?for?the?query?part?of?the????????????????????????????upsert.?You?should?make?sure?this?is?indexed????--stopOnError???????????stop?importing?at?first?error?rather?than?continuing????--jsonArray?????????????load?a?json?array,?not?one?item?per?line.?Currently????????????????????????????limited?to?4MB.??8、從向MongoDB導(dǎo)出數(shù)據(jù)
mongoexport -d pagedb -c page -q {} -f _id,title,url,spiderName,pubDate --csv > pages.csv
說(shuō)明:將pagedb數(shù)據(jù)庫(kù)中page集合的數(shù)據(jù)導(dǎo)出到pages.csv文件,其中各選項(xiàng)含義:
-f 指定cvs列名為_(kāi)id,title,url,spiderName,pubDate
-q 指定查詢條件
其他各個(gè)選項(xiàng)的使用,可以查看幫助:
[plain]?view plain?copy
mongoexport?--help??options:????--help??????????????????produce?help?message????-v?[?--verbose?]????????be?more?verbose?(include?multiple?times?for?more?verbosity?e.g.?-vvvvv)????-h?[?--host?]?arg???????mongo?host?to?connect?to?(?<set?name>/s1,s2?for?sets)????--port?arg??????????????server?port.?Can?also?use?--host?hostname:port????--ipv6??????????????????enable?IPv6?support?(disabled?by?default)????-u?[?--username?]?arg???username????-p?[?--password?]?arg???password????--dbpath?arg????????????directly?access?mongod?database?files?in?the?given????????????????????????????path,?instead?of?connecting?to?a?mongod??server?-????????????????????????????needs?to?lock?the?data?directory,?so?cannot?be?used????????????????????????????if?a?mongod?is?currently?accessing?the?same?path????--directoryperdb????????if?dbpath?specified,?each?db?is?in?a?separate?directory????-d?[?--db?]?arg?????????database?to?use????-c?[?--collection?]?arg?collection?to?use?(some?commands)????-f?[?--fields?]?arg?????comma?separated?list?of?field?names?e.g.?-f?name,age????--fieldFile?arg?????????file?with?fields?names?-?1?per?line????-q?[?--query?]?arg??????query?filter,?as?a?JSON?string????--csv???????????????????export?to?csv?instead?of?json????-o?[?--out?]?arg????????output?file;?if?not?specified,?stdout?is?used????--jsonArray?????????????output?to?a?json?array?rather?than?one?object?per?line??注意:
如果上面的選項(xiàng)-q指定一個(gè)查詢條件,需要使用單引號(hào)括起來(lái),如下所示:
[plain]?view plain?copy
mongoexport?-d?page?-c?Article?-q?'{"spiderName":?"mafengwoSpider"}'?-f?_id,title,content,images,publishDate,spiderName,url?--jsonArray?>?mafengwoArticle.txt??否則,就會(huì)出現(xiàn)下面的錯(cuò)誤:[plain]?view plain?copy
ERROR:?too?many?positional?options?? (六)遠(yuǎn)程連接管理
?
1、基于mongo實(shí)現(xiàn)遠(yuǎn)程連接
[plain]?view plain?copy
mongo?-u?admin?-p?admin?192.168.0.197:27017/pagedb??通過(guò)mongo實(shí)現(xiàn)連接,可以非常靈活的選擇參數(shù)選項(xiàng),參看命令幫助,如下所示:
[plain]?view plain?copy
mongo?--help??MongoDB?shell?version:?1.8.3??usage:?mongo?[options]?[db?address]?[file?names?(ending?in?.js)]??db?address?can?be:????foo???????????????????foo?database?on?local?machine????192.169.0.5/foo???????foo?database?on?192.168.0.5?machine????192.169.0.5:9999/foo??foo?database?on?192.168.0.5?machine?on?port?9999??options:????--shell???????????????run?the?shell?after?executing?files????--nodb????????????????don't?connect?to?mongod?on?startup?-?no?'db?address'???????????????????????????arg?expected????--quiet???????????????be?less?chatty????--port?arg????????????port?to?connect?to????--host?arg????????????server?to?connect?to????--eval?arg????????????evaluate?javascript????-u?[?--username?]?arg?username?for?authentication????-p?[?--password?]?arg?password?for?authentication????-h?[?--help?]?????????show?this?usage?information????--version?????????????show?version?information????--verbose?????????????increase?verbosity????--ipv6????????????????enable?IPv6?support?(disabled?by?default)??2、基于MongoDB支持的javascript實(shí)現(xiàn)遠(yuǎn)程連接
當(dāng)你已經(jīng)連接到一個(gè)遠(yuǎn)程的MongoDB數(shù)據(jù)庫(kù)服務(wù)器(例如,通過(guò)mongo連接到192.168.0.184),現(xiàn)在想要在這個(gè)會(huì)話中連接另一個(gè)遠(yuǎn)程的數(shù)據(jù)庫(kù)服務(wù)器(192.168.0.197),可以執(zhí)行如下命令:
[plain]?view plain?copy
>?var?x?=?new?Mongo('192.168.0.197:27017')??>?var?ydb?=?x.getDB('pagedb');??>?use?ydb??switched?to?db?ydb??>?db??ydb??>?ydb.page.findOne()??{??????????"_id"?:?ObjectId("4eded6a5bf3bfa0014000003"),??????????"content"?:?"巴黎是浪漫的城市,可是...",??????????"pubdate"?:?"2006-03-19",??????????"title"?:?"巴黎:從布魯塞爾趕到巴黎",??????????"url"?:?"http://france.bytravel.cn/Scenery/528/cblsegdbl.html"??}??上述通過(guò)MongoDB提供的JavaScript腳本,實(shí)現(xiàn)對(duì)另一個(gè)遠(yuǎn)程數(shù)據(jù)庫(kù)服務(wù)器進(jìn)行連接,操作指定數(shù)據(jù)庫(kù)pagedb的page集合。
如果啟用了安全認(rèn)證模式,可以在獲取數(shù)據(jù)庫(kù)連接實(shí)例時(shí),指定認(rèn)證賬號(hào),例如:
[plain]?view plain?copy
>?var?x?=?new?Mongo('192.168.0.197:27017')??>?var?ydb?=?x.getDB('pagedb',?'shirdrn',?'(jkfFS$343$_\=\,.F@3');??>?use?ydb??switched?to?db?ydb???
轉(zhuǎn)載于:https://my.oschina.net/chendongj/blog/795610
總結(jié)
以上是生活随笔為你收集整理的MongoDB基本管理命令的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。