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