MongoDB教程(二) 詳解

MongoDB的數據架構

官方是這樣描述的 

MongoDB stores all documents in collections. A collection is a group of related documents that have a set of shared common indexes. Collections are analogous to a table in relational databases. 

這裏寫圖片描述 

根據其描述,可以大致歸納MongoDB的結果如下圖: 

這裏寫圖片描述

解析:一個數據庫(Database)中可以包含多個集合(colection),每個集合中,可以包含多個文檔。可以類比,SQL數據庫,一個數據庫中包含多個表,每個表中包含多個記錄。

命令規範

數據庫命令

1.任意UTF-8(中文也行) 

2.不能是空字符串 

3.不得包含以:’空格’、’.’ 、’$’、’/’、’\’、’\0’。 

4.長度不得超過64字節. 

5.不能使用保留字:admin、local、config

集合

1.任意的UTF-8字符串 

2.不能是空的字符串 

3.不能包含\0、$ 

4.不能以system.開頭

文檔

1.任意的UTF-8字符串 

2.不能是空字符串 

3.不能包含\0、$ 

4.不能以_開頭

數據類型

官方提示MongoDB支持類型有如下: 

這裏寫圖片描述 

null null用於表示空值或者不存在的字段。 {“tmpkey”:null} 

布爾 布爾類型有兩個值’true’和’false1’. {“tmpkey”:true} 

32位整數 類型不可用。JavaScript僅支持64位浮點數,所以32位整數會被自動轉換。 

64位整數 不支持這個類型。shell會使用一個特殊的內嵌文檔來顯示64位整數 

64位浮點數 shell中的數字都是這種類型。下面的表示都是浮點數: {“tmpkey” : 5.12} 

字符串 UTF-8字符串都可表示爲字符串類型的數據: {“tmpkey” : “abf”} 

符號 不支持這種類型。shell將數據庫裏的符號類型轉換成字符串。 

對象id 對象id是文檔的12字節的唯一 ID, {“tmpkey” :ObjectId() } 

日期 日期類型存儲的是從標準紀元開始的毫秒數。不存儲時區: {“tmpkey” : new Date()} 

正則表達式 文檔中可以包含正則表達式,採用JavaScript的正則表達式語法: {“tmpkey” : /\w/i} 

代碼 文檔中還可以包含JavaScript代碼:{“tmpkey” : function() { /* …… */ }} 

二進制數據 二進制數據可以由任意字節的串組成。不過shell中無法使用。 

最大值 BSON包括一個特殊類型,表示可能的最大值。shell中沒有這個類型。 

最小值 BSON包括一個特殊類型,表示可能的最小值。shell中沒有這個類型。 

未定義 文檔中也可以使用未定義類型:{“tmpkey”:undefined} 

數組 值的集合或者列表可以表示成數組:{“tmpkey” : [“a”, “b”, “c”]} 

內嵌文檔 文檔可以包含別的文檔,也可以作爲值嵌入到父文檔中,數據可以組織得更自然些,不用非得存成扁平結構的:{“tmpkey” : {“color” : “yello”}}

MongoDB集合的操作

在學習mongoDB集合的時候,可以將其類比SQL數據庫中的表。

創建集合

1.顯示創建 

創建之前,我們先建立一個數據庫,關於數據庫的建立,可以參考上一篇文章(http://blog.csdn.net/hsd2012/article/details/51279472) 

這裏寫圖片描述 

我們知道,在SQL數據庫中,我們使用show tables查看包含的表,那麼在MongoDB怎樣才能查看當前數據庫中包含的集合呢?此時使用的是show collections; 

這裏寫圖片描述 

student代表集合,system.indexes代表MongoDB的索引。 

2.隱式創建 

db.class.insert({‘classid’:1,’className’:”三年二班”}); 

代表網class集合中插入一個文檔(班級編號爲1,班級名稱爲三年二班)。本質是,往一個集合中插入一條數據,如果這個集合不存在,mongoDB會自動幫我們創建該集合。 

這裏寫圖片描述

顯示數據庫中所有集合

下面兩條命令都可以實現顯示所有的集合。 

show collections 

show tables 

這裏寫圖片描述

刪除集合

db.collectionName.drop(); 

這裏寫圖片描述

MongoDB文檔的操作

在學習mongoDB文檔的時候,可以將其類比SQL數據庫表中的數據。數據庫表中每一行,可以類比中集合中每一個文檔。

數據的插入

MongoDB中數據插入,指的是將創建的文檔,插入到指定的集合中。 

命令如下: 

db.collectionName.insert(doc); 

官方文檔提示: 

The operation will create the collection if the collection does not currently exist 

Insert a document into a collection 

Insert an Array of Documents 

如果集合不存在,則創建該集合。doc可以爲一個集合或者一個集合數組。 

1.向school數據庫的student集合中,插入一個文檔。

db.student.insert({"stu_id":1,"stu_name":"張三","age":6,"class_id":1});

    • 1

這裏寫圖片描述 

通過db.student.find();查找集合中的數據,我們可以看到,剛剛我們插入的數據。那麼”_id”是什麼意思呢?這是MongoDB自動生成的一個全球唯一的主鍵,用於區分文檔。其包含四部分:時間戳、機器、PID(進程號)、計數器。 

1.向school數據庫的student集合中,插入多個文檔。

var docArr=[{"stu_id":2,"stu_name":"李四"},{"stu_id":3,"stu_name":"王五","class_id":1},{"stu_id":4,"stu_name":"趙六",age:10,"hobby":"football"}];
db.student.insert(docArr);
    • 1
    • 2

代碼執行效果如下: 

這裏寫圖片描述

數據刪除

命令如下: 

db.collectionName.remove(where,[justOne]); 

where 代表刪除條件,當where爲{}代表刪除所有文檔。 

justOne 默認情況下爲false,代表匹配條件的文檔有多個的時候,刪除所有的匹配文檔。如果設置爲true或1(設置其他非0的整數也可以),代表僅僅刪除一個文檔。 

實例 

1.刪除school數據庫student集合里名字(stu_name)爲趙六的文檔。

db.student.remove({"stu_name":"趙六"});

    • 1

代碼執行效果如下: 

這裏寫圖片描述 

2.刪除school數據庫student集合裏班級編號(class_id)爲1的一個集合。 

爲了便於操作,我先往student集合裏面添加了一些文檔,此時集合中文檔數據內容如下: 

這裏寫圖片描述 

可以發現,class_id爲1的集合有4個。

db.student.remove({"class_id":1},2);
    • 1

執行結果如下: 

這裏寫圖片描述 

可以發現,雖然滿足條件的文檔很多,但是僅僅刪除了其中一個文檔。

數據修改

在mongoDB中修改數據(文檔),是通過如下命令來實現的 

db.collectionName.update(query,update,upset,multi); 

collectionName:集合名字 

query: 修改的條件,類似SQL的where語句。 

update :更新命令,類似SQL的set語句。 

upset :可選,默認是false,如果未發現符合更新條件的數據內容,是否執行插入操作,1或者true代表進行插入 0或者false不進行插入。 

multi :可選,mongodb 默認是false。是否進行多行更新。1或者true進行多行更新 0或者false不進行多行更新。 

關於update 格式有兩種形式 

1.直接賦值使用{set:{}}  如{set:{}}  如{

如{set:{}}  如{set:{“name”:”張三”}},將名字改爲張三 

2.進行算術運算使用{inc:{}}  如{inc:{}}  如{

如{inc:{}}  如{inc:{“age”:3}},將age增加3 

如{$inc:{“age”:-3}},將age減3 

實例 

1.更新學生編號(stu_id)爲2文檔,爲其添加一個字段年齡(age)爲13

db.student.update({"stu_id":2},{$set:{"age":13}});

    • 1

執行結果如下: 

這裏寫圖片描述 

2.更新學生,將其年齡(age)設置爲12

db.student.update({},{$set:{"age":12}},0,1);
    • 1

這裏寫圖片描述 

3.將班級編號爲2的所有學生,年齡(age)增加1 

代碼如下

db.student.update({"class_id":2},{$inc:{"age":1}},0,1);
    • 1

執行效果如下圖 

這裏寫圖片描述

數據查詢

基本的查詢操作

1.查詢集合中的所有文檔 

db.collectionName.find(); 

例題:查找集合student中所有數據。 

爲了便於查找,先向其中插入一些數據

for(var i=0;i<20;i++){
db.student.insert({"stu_id":9+i,"stu_name":"趙"+i});
}
db.student.find();

    • 1
    • 2
    • 3
    • 4

執行結果如下 

這裏寫圖片描述 

2.查詢集合中的第一個文檔 

db.collectionName.findOne(); 

這裏寫圖片描述

條件查詢

1.MongoDB中查詢條件

數據查詢條件MongoDB中應用實例講解
等於(=)----查找名字爲李四的所有學生db.student.find({“name”:”李四”});
等於(!=)$ne查找名字爲李四的所有學生db.student.find({"name":{$ne:"李四"}});
大於(>)$gt查找所有年齡大於5的學生db.student.find({"age":{$gt:5}});
大於(<)$lt查找所有年齡小於15的學生db.student.find({"age":{$lt:15}});
大於等於(>=)$gte查找所有年齡大於或等於5的學生db.student.find({"age":{$gte:5}});
小於等於(>=)$lte查找所有年齡小於或等於15的學生db.student.find({"age":{$lte:15}});
與(and)----查找所有年齡小於或等於15且班級編號爲1的所有學生db.student.find({"age":{$lte:15},"class_id":1});
或(or){$or:[{條件1},{條件2}]}查找所有年齡小於或等於15或者班級爲1的所有學生db.student.find({$or:[{"age":{$lte:15}},{"class_id":1}]});
非或(nor){$nor:[{條件1},{條件2}]}條件1不能滿足和條件2不能滿足。
集合運算符(in)$in查找年齡12或者13或者14的學生。db.student.find({"age":{$in:[12,13,14]}});
集合運算符(all)$all查找愛好包含football,和basketBall的所有學生db.student.find({"hobby":{$all:["football","basketBall"]}});
是否存在(exists)$exists查詢存在hooby的所有學生db.student.find({hobby:{$exists:1}}),{$exists:0}代表不存在

統計、排序、分頁

1.統計 

db.collectionName.count(); 

db.collectionName.find().count(); 

這裏寫圖片描述 

2.排序 

db.collectionName.find().sort({key:1});//key升序排列 

這裏寫圖片描述 

db.collectionName.find().sort({key:-1});//key降序排列 

這裏寫圖片描述 

3.分頁 

db.collectionName.find().skip(n).limit(m); 

解析:從collectionName中第n個文檔開始讀取,共讀取m個文檔,需要注意的是MongoDB中n是從0開始的。可以類比Mysql中limit方法。n相當於limit中的第一個方法,m相當於limit中第二個參數 

當使用分頁時候,若使用count,需要注意mongoDB統計數量默認是忽略分頁的,看下圖: 

這裏寫圖片描述 

怎樣讓其不忽視分頁呢?這時候需要給count傳遞一個參數count(flag)。flag爲0(默認情況爲0)忽視分頁,flag爲1,不忽視分頁。 

這裏寫圖片描述 

實例: 

1.從student中取出6~12條數據

db.student.find().skip(6).limit(6);

    • 1

這裏寫圖片描述 

2.從集合student中取出第一條數據

db.student.find().skip(0).limit(1);
    • 1

這裏寫圖片描述

投影查詢

在MongoDB中,上面講的每次查詢都是將所有的鍵都顯示出來了,怎樣只讓部分鍵顯示呢?這就要用到投影查詢。 

比如,我只讓集合student查詢結果中stu_name顯示。

db.student.find({},{_id:0,stu_id:0});

    • 1

這裏寫圖片描述 

解析:在mongoDB中,find函數裏面的第二個參數是用來控制讓哪些鍵顯示或者不顯示。0是不顯示,1爲顯示。默認情況下,爲顯示。

備註

清空屏幕 

cls命令

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章