標籤:
在shell中刪除一個集合,執行db.test.drop()或者db.runCommand({"drop":"test"}),在MongoDB中命令其實是作為一種特殊類型的查詢來實現的,這些查詢針對$cmd集合來執行,runCommand僅僅是接受命令文檔,執行等價查詢,因此drop調用實際是這樣的:
db.$cmd.findOne({"drop":"test"})
db.listCommands() 列出所有的命令
MongoDB支援固定集合,要事先建立,而且大小固定,固定集合很像環形隊列,如果空間不足,最早的文檔就會被刪除,為新的文檔騰出空間。固定集合在預設情況下沒有索引,即便是"_id"上也沒有索引。
建立固定集合可以使用createCollection來建立
db.createCollection("my_collection",{capped:true,size:1000})
可以將普通集合轉為固定集合
db.runCommand({"convertToCapped":"my_collection",size:1000} )
固定集合有種特殊的排序方式即自然排序,自然順序就是文檔在磁碟上的順序,因為固定集合的文檔總是按照插入的順序儲存的,自然順序就是與此相同。也可以按照反洗插入的順序查詢,如下:
db.my_collection.find().sort({"$natural":-1})
使用{"$natural":1}表示與預設順序相同,非固定集合不能保證文檔按照特定順序儲存,所以自然順序的意義不大。
尾部遊標是一種特殊的持久遊標,這類遊標不會在沒有結果後銷毀,一旦有新文檔添加到集合裡就會被取回並輸出,尾部遊標只能用在固定集合上。【MongoDB shell不支援尾部遊標】
GridFS是一種在MongoDB中儲存大二進位檔案的機制
PS D:\install\MongoDB\Server\3.0> .\bin\mongofiles.exe search foo2015-04-07T13:31:03.326+0800 connected to: localhostPS D:\install\MongoDB\Server\3.0> .\bin\mongofiles.exe put foo.txt2015-04-07T13:31:17.425+0800 connected to: localhostadded file: foo.txtPS D:\install\MongoDB\Server\3.0> .\bin\mongofiles.exe get foo.txt2015-04-07T13:31:24.541+0800 connected to: localhostfinished writing to: foo.txtPS D:\install\MongoDB\Server\3.0> .\bin\mongofiles.exe delete foo.txt2015-04-07T13:31:33.263+0800 connected to: localhostsuccessfully deleted all instances of ‘foo.txt‘ from GridFS
GridFS是一個建立在普通MongoDB文檔基礎上的輕量級儲存規範,MongoDB伺服器對GridFS請求沒有什麼特別照顧,所有相關工作都由用戶端驅動或者工具完成。GridFS的一個基本思想就是可以將大檔案分成很多小塊,每塊作為一個單獨的文檔儲存,這樣就能儲存大檔案了,除了隱藏檔本身的塊,還有一個單獨文檔用來儲存塊的資訊和檔案的中繼資料。
GridFS的塊有個單獨的集合,預設情況下,塊將使用fs.chunks集合
fs.chunks裡邊的結構如下:
{
"_id" ,塊的唯一ID
"n", 塊的編號即這個塊在原檔案中的順序編號
"data",包含組成檔案塊的位元據
"files_id" 包含這個塊中繼資料的檔案文檔的"_id"
}
檔案的中繼資料放在另一個集合中,預設是fs.files,這裡邊的每個文檔代表GridFS中的一個檔案,與檔案相關的自訂中繼資料也可以存在其中,除了使用者自訂的鍵,GridFS規範還定義了一些鍵。
_id 檔案唯一id,在塊中作為“files_id”鍵的值儲存
length 檔案中內容總的位元組數
chunkSize 每塊的大小,位元組為單位,預設256K,必要時可以調整
uploadData 檔案存入GridFS的時間戳記
md5 檔案內容的md5校正和,由伺服器端產生
在伺服器端可以通過db.eval函數執行JavaScript指令碼
> db.eval("return 1;")1> db.eval("function(){return 1;}")1> db.eval("function(a,b){return a+b;}",1,2)3
每個MongoDB的資料庫中都有一個特殊的集合system.js,用來存放JavaScript變數,這些變數可以在任何MongoDB的JavaScript上下文中調用。
> db.system.js.find()> db.system.js.insert({"_id":"x","value":1})WriteResult({ "nInserted" : 1 })> db.system.js.insert({"_id":"y","value":2})WriteResult({ "nInserted" : 1 })> db.system.js.insert({"_id":"z","value":3})WriteResult({ "nInserted" : 1 })> db.eval("return x+y+z;")6> db.system.js.find(){ "_id" : "x", "value" : 1 }{ "_id" : "y", "value" : 2 }{ "_id" : "z", "value" : 3 }
使用儲存的JavaScript缺點就是代碼會與常規的原始碼控制脫離,會攪亂用戶端發送來的JavaScript,最適合使用儲存JavaScript的情況就是程式中有多個地方都要用到一個JavaScript函數,將這樣的函數放置在中心位置,要是有更新的話就可以不必每處都修改。
DBRef(資料庫引用)就像URL,唯一確定一個到文檔的引用。
DBRef是個內嵌文檔,但是DBRef有些必選鍵"$ref"、"$id"可選鍵"$db"
DBRef中鍵的順序不能改變,第一個必須是"$ref",接著是"$id",然後是(可選的)"$db"
{"$ref":collection,"$id":id_value,"$db":database}
collection:指向一個集合
id_value:集合雷根據"_id"確定唯一的文檔
database:資料庫
> db.user.find()> db.users.find(){ "_id" : "mike", "display_name" : "Mike D" }{ "_id" : "kristina", "display_name" : "Kristina C" }> db.nodes.insert({"_id":20,"author":"kristina","text":"... and DBRefs are easy,too", "references":[{"$ref":"users","$id":"mike"}, {"$ref":"nodes","$id":5}]})WriteResult({ "nInserted" : 1 })> db.nodes.insert({"_id":5,"author":"mike","text":"MongoDB is fun!"})WriteResult({ "nInserted" : 1 })> var note=db.nodes.findOne({"_id":20})> note.references.forEach(function(ref){ printjson(db[ref.$ref].findOne({"_id":ref.$id})); }){ "_id" : "mike", "display_name" : "Mike D" }{ "_id" : 5, "author" : "mike", "text" : "MongoDB is fun!" }
MongoDB學習筆記06