javascript
MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本
介紹MongoDB支持的一些高級(jí)功能:
數(shù)據(jù)庫(kù)命令
固定大小的集合
GridFS存儲(chǔ)大文件
MongoDB對(duì)服務(wù)端JavaScript的支持
數(shù)據(jù)庫(kù)命令
命令的原理
MongoDB中的命令其實(shí)是作為一種特殊類(lèi)型的查詢(xún)來(lái)實(shí)現(xiàn)的,這些查詢(xún)針對(duì)$cmd集合來(lái)執(zhí)行。runCommand僅僅是接受命令文檔,執(zhí)行等價(jià)查詢(xún)。
>db.runCommand({"drop":"test"})
上面的命令等價(jià)于下面的查詢(xún):
>db.$cmd.findOne({"drop":"test"})
當(dāng)MongoDB服務(wù)器得到查詢(xún)$cmd集合的請(qǐng)求時(shí),會(huì)啟動(dòng)一套特殊的邏輯來(lái)處理,而不是交給普通的查詢(xún)代碼來(lái)執(zhí)行。
有些 命令的訪(fǎng)問(wèn)需要管理員權(quán)限,必須在admin數(shù)據(jù)庫(kù)里運(yùn)行。否則會(huì)得到“拒絕訪(fǎng)問(wèn)”的錯(cuò)誤。
常見(jiàn)命令列表
可以使用db.listCommand()列出MongoDB支持的所有命令。經(jīng)常使用的命令如下:
buildInfo:返回MongoDB服務(wù)器的版本號(hào)和主機(jī)的操作系統(tǒng)等信息
>db.runCommand({"buildInfo":1})
collStats:返回指定集合的統(tǒng)計(jì)信息,包括數(shù)據(jù)大小、已分配的存儲(chǔ)空間和索引大小。
>db.runCommand({"collStats":"collectionName"})
distinct:返回指定集合中滿(mǎn)足查詢(xún)條件的指定鍵的所有不同的值
>db.runCommand({"distinct":"collectionName","key":"keyName","query":query})
drop:刪除指定集合
>db.runCommand({"drop":"collectionName"})
dropDatabase:刪除db指向的數(shù)據(jù)庫(kù),
>db.runCommand({"dropDatabase":1})
dropIndexes:刪除集合中指定名稱(chēng)的索引,名稱(chēng)為*時(shí)刪除全部。
>db.runCommand({"dropIndexes":"collectionName","index":"indexName"})
findAndModify:返回已更新的文檔
>db.runCommand({"findAndModify":"collectionName","query":query, "sort":sort, "update":update})
getLastError:返回對(duì)本集合執(zhí)行的最后一次操作的錯(cuò)誤信息或者其他狀態(tài)信息。
>db.runCommand({"getLastError":1})
isMaster:檢測(cè)本服務(wù)器是否為主服務(wù)器
>db.runCommand({"isMaster":1})
listCommands:返回所有可以在服務(wù)器上運(yùn)行的命令及相關(guān)信息
>db.runCommand({"listCommands":1})
listDatabases:列出服務(wù)器上所有的數(shù)據(jù)庫(kù),與show dbs結(jié)果類(lèi)似,管理員專(zhuān)用
>db.runCommand({"listDatabases":1})
ping:檢測(cè)服務(wù)器連接是否正常
>db.runCommand({"ping":1})
renameCollection:重命名集合
>db.runCommand({"renameCollection":a, "to":b})
repairDatabase:修復(fù)并壓縮當(dāng)前數(shù)據(jù)庫(kù),db指向的數(shù)據(jù)庫(kù)
>db.runCommand({"repairDatabase":1})
serverStatus:返回本服務(wù)器的管理統(tǒng)計(jì)信息
>db.runCommand({"serverStatus":1})
固定集合
固定集合需要實(shí)現(xiàn)創(chuàng)建且大小固定(文檔數(shù)量、容量)。插入文檔時(shí),若還有空間,則在尾部插入,否則最早的文檔會(huì)被刪除。默認(rèn)情況下,固定集合是沒(méi)有索引的,即便是”_id”.
1)特點(diǎn)
對(duì)固定集合進(jìn)行插入速度快,插入實(shí)際上就是簡(jiǎn)單的memcpy(內(nèi)存復(fù)制);文檔本身按照插入的順序存儲(chǔ);空間不夠時(shí),自動(dòng)淘汰最早的數(shù)據(jù)。
2)創(chuàng)建固定集合
固定集合必須在使用前顯示創(chuàng)建,使用createCollection()方法來(lái)創(chuàng)建:
>db.createCollection("collectionName",{"capped":true,size:10000,max:100})
size:指定集合的存儲(chǔ)空間,單位字節(jié)
max:指定文檔的數(shù)量(可選)。
當(dāng)指定文檔數(shù)量上限時(shí),必須同時(shí)指定大小。淘汰機(jī)制只有在容量還沒(méi)滿(mǎn)時(shí)才會(huì)依據(jù)文檔數(shù)量來(lái)工作。要是容量滿(mǎn)了,會(huì)依據(jù)容量來(lái)工作。
3)自然排序
自然順序就是文檔在磁盤(pán)上的順序。固定集合的文檔總是按照插入的順序存儲(chǔ)的,自然順序與此相同,也可以使用自然排序按照反方向插入的順序查詢(xún):
>db.my_collection.find().sort({"$natural":-1})
4)尾部游標(biāo)
尾部游標(biāo)是一種特殊的持久游標(biāo),不會(huì)在沒(méi)有結(jié)果后銷(xiāo)毀,只能用在固定集合上。
GridFS:存儲(chǔ)大文件
GridFS是MongoDB中存儲(chǔ)大二進(jìn)制文件的機(jī)制,其特點(diǎn)有如下幾方面:
可以簡(jiǎn)化需求,不需要使用獨(dú)立文件存儲(chǔ)架構(gòu);直接利用已經(jīng)建立的復(fù)制或分片機(jī)制,便于故障恢復(fù)和擴(kuò)展;避免用于存儲(chǔ)用戶(hù)上傳內(nèi)容的文件系統(tǒng)出現(xiàn)問(wèn)題;不產(chǎn)生磁盤(pán)碎片。
使用GridFS:mongofiles
利用mongofiles應(yīng)用程序,可以用來(lái)在GridFS中上傳、下載、列示、查看或刪除文件。使用mongofiles --help查看所有選項(xiàng)。
基本用法是:mongofiles [options] command [gridfs filename]
命令有如下選擇:list(列示)、search(查看)、put(上傳)、get(下載)、delete(刪除)
>mongofiles put E:\MongoDB\dbData\UploadTest.txt
>mongofiles list
>mongofiles get E:\MongoDB\dbData\UploadTest.txt
選項(xiàng)有如下的選擇:
-h[--host]:指定上傳的主機(jī)地址,默認(rèn)localhost
--port:指定上傳的端口號(hào),默認(rèn)27017
-u[--username]:指定用戶(hù)名
-p[--password]:指定對(duì)應(yīng)的密碼
--dbpath:指定數(shù)據(jù)文件存放路徑
-d[--db]:指定使用的數(shù)據(jù)庫(kù)
-c[--collection]:指定使用的集合
-l[--local]:上傳/下載時(shí)的本地文件名,默認(rèn)與gridfs上的文件名一致
內(nèi)部原理
GridFS是一個(gè)建立在普通MongoDB文檔基礎(chǔ)上的輕量級(jí)文件存儲(chǔ)規(guī)范。其思想是將大文件分成很多塊,每塊作為一個(gè)單獨(dú)的文檔存儲(chǔ),除了存儲(chǔ)文件本身的塊,還有一個(gè)單獨(dú)的文檔用來(lái)存儲(chǔ)分塊的信息和文件的元數(shù)據(jù)。
默認(rèn)情況下,塊使用對(duì)應(yīng)數(shù)據(jù)庫(kù)(沒(méi)有指明時(shí)是test數(shù)據(jù)庫(kù))的fs.chunks集合。文件的元數(shù)據(jù)放在fs.files(默認(rèn))集合下。
服務(wù)器端腳本
在服務(wù)端可以通過(guò)db.eval()來(lái)執(zhí)行javascript腳本,也可以將javascript腳本保存在數(shù)據(jù)庫(kù)中,然后在別的數(shù)據(jù)庫(kù)命令中調(diào)用。
1)db.eval()
該函數(shù)可以在服務(wù)端執(zhí)行任意javascript代碼,先將給定的javascript字符串發(fā)生給MongoDB,然后返回結(jié)果。
>db.eval("return 1;")
參數(shù)可以通過(guò)eval的第二個(gè)參數(shù)指定,需寫(xiě)成數(shù)組的形式。
>db.eval("function(u){print(’hello,’+u);}",[ "wangdh"])
2)存儲(chǔ)javascript
每個(gè)數(shù)據(jù)庫(kù)都有一個(gè)特殊的集合,叫做system.js,用來(lái)存放javascript變量,這些變量可以在任何MongoDB的javascript上下文中調(diào)用。
>db.system.js.insert({"_id":"username","value":"wangdh"})
system.js還可以用來(lái)存放javascript代碼
>db.system.js.insert({"_id":"log","value":function(msg,level){
var levels=["DEBUG","WARN","ERROR","FATAL"];
level=level?level:0;
var now=new Date();
print(now+" "+levels[level]+msg);
}})
>db.eval("x=1;log(‘x is ’+x,1)")
轉(zhuǎn)載于:https://www.cnblogs.com/Jxwz/p/4188342.html
總結(jié)
以上是生活随笔為你收集整理的MongoDB学习笔记-06 数据库命令、固定集合、GridFS、javascript脚本的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 坑爹的uint32_t
- 下一篇: 第二部分_搭建Java Web开发环境与