MongoDB學習筆記(一)

來源:互聯網
上載者:User

標籤:系統   fail   comment   統計   ase   print   知識   rem   整數   

1.MongoDB簡介 MongoDB介紹
MongoDB是面向文檔的非關係型資料庫,不是現在使用最普遍的關係型資料庫,其放棄關聯式模式的原因就是為了獲得更加方便的擴充、穩定容錯等特性。面向文檔的基本思路就是:將關聯式模式中的“行”的概念換成“文檔(document)”模型。面向文檔的模型可以將文檔和數組內嵌到文檔中。因此,實際中可以用一條資料表示非常複雜的結構。MongoDB沒有預定義模式:文檔的鍵(key)和值(value)不再是固定的類型和大小,而且根據需求要添加或者刪除欄位變得更容易了。由於沒有模式需要更改,通常不需要遷移大量資料。不必將所有資料都放到一個模子裡面,應用程式層可以處理新增或丟失的鍵。這樣開發人員可以非常容易地變更資料模型。實際應用中,隨著資料量的增大,資料庫都要進行擴充。擴充有縱向擴充和橫向擴充。縱向擴充是使用計算能力更強的機器,也是最省力的方法,但是很容易達到物理極限,無論花多少錢也買不到最新的機器了。橫向擴充就是通過分區將資料分散到更多的機器上。MongoDB的設計採用橫向擴充。面向文檔的資料模型使它很容易地在多台伺服器之間進行資料分割。還可以自動處理跨叢集的資料和負載,自動重新分配文檔,以及將使用者請求路由到正確的機器上。開發人員根本不用考慮資料庫層次的擴充問題,需要擴充資料庫時,在叢集中添加機器即可,MongoDB會自動處理後續的事情。MongoDB有如上各種特性,但為了達到這些,他也放棄了關係型資料庫的某些功能如表串連join和複雜的多行事務。

 
直觀瞭解: 

 MongoDB的優勢與劣勢 優勢
  1. 快速!基於記憶體,將熱資料存放在實體記憶體中(不僅僅只是索引和少部分資料),從而提高了整體速度和效率。
  2. 高擴充性!MongoDB的高可用和叢集架構擁有十分高的擴充性。
  3. 自身的FailOver機制!在複本集中,當主庫遇到問題,無法繼續提供服務的時候,複本集將選舉一個新的主庫繼續提供服務。
  4. JSon格式的資料!MongoDB的Bson和JSon格式的資料十分適合文檔格式的儲存與查詢。
 劣勢
  1. 應用經驗少!由於NoSQL興起時間短,應用經驗相比關係型資料庫較少。
  2. 由於以往用到的都是關係型資料庫,可能會造成使用者一開始的不適應。
  3. 無事務機制!MongoDB本身沒有內建事務機制,若需要在MongoDB中實現事務機制,需通過一個額外的表,從邏輯上自行實現事務。
 2.MongoDB與MYSQL對比
資料庫 MongoDB MySQL
資料庫模型 非關係型 關係型
儲存方式 以類JSON的文檔的格式儲存 不同引擎有不同的儲存方式
查詢語句 MongoDB查詢方式(類似JavaScript的函數) SQL語句
資料處理方式 基於記憶體,將熱資料存放在實體記憶體中,從而達到高速讀寫 不同引擎有自己的特點
成熟度等級 新興資料庫,成熟度等級較低 成熟度等級高
廣泛度 NoSQL資料庫中,比較完善且開源,使用人數在不斷增長 開來源資料庫,市場份額不斷增長
事務性 僅支援單文檔事務操作,弱一致性 支援事務操作
佔用空間 佔用空間大 佔用空間小
join操作 MongoDB沒有join MySQL支援join

下面是Mongodb與Mysql的操作命令的對比: 

 MongoDB基礎知識與CRUD

1.文檔(document):相當於傳統關係型資料庫的“行”,但比傳統行表示的資訊更加複雜。例如:

 
{"name":"jack","age":18,"sex":"male"}

2.集合(collection):這個在MongoDB中代表一組文檔,類似於關係型資料庫中的表。但在MongoDB中的表(就是集合)是沒有模式的,你可以將完全不同的文檔放入同一個集合中.但在實際使用中,為特定集合隱性規定一種模式。註:當集合裡沒有任何文檔時集合其實也是不存在的。當第一個文檔插入時,集合就會被建立。 
3.資料庫(database):在MongoDB中,一組集合可以組成一個資料庫。一個MongoDB執行個體可以承載多個資料庫。每個資料庫都有獨立的許可權控制。在實際應用中,通常,一個應用的所有資料放置在一個資料庫中。 
4.資料類型:MongoDB中的文檔類似於JSON。JSON是一種簡單的資料交換格式,在資料類型方面,只支援:null,布爾,數字,字串,數組和對象。這幾種類型在某些實際應用中表現力還是不夠,比如JSON本身不直接支援日期類型,對於數字,JSON本身也沒法區分整數和浮點數,更不能區分32位元字和64位元字。為此,MongoDB再保留了JSON的各類特性外,又為其添加了一些資料類型。 
1.null:用於表示空值或不存在的欄位。Shell中這樣表示:{"x":null} 
2.布爾:有兩個值,true和false。Shell中這樣使用:{"x":true} 
3.數字:Shell中數字均為64位浮點數,如在Shell中{"x":3.14}{"x":3}這兩個文檔中的值均是64位的浮點數。 
4.字串:這個用的最廣,Shell中這樣表示:{"x":"hello world!"} 
5.日期:這個在資料存放區時,儲存的是從標準紀元開始的毫秒數,沒有儲存時區資訊。 
6.Regex:文檔中可以包含Regex,採用JavaScript的Regex文法即可,Shell中這樣表示:{"x":/foobar/i}
7.數組:數組是一組值,既可以表示為有序對象(列表,棧,隊列等)也可以表示無序對象(集合),Shell中這樣表示一個數組:{"things":["pie",3.14]}。 
8.內嵌文檔:把一個文檔整個作為另一個文檔某一個鍵對應的值。 
其他包括位元據,代碼等。

 MongoDB入門(Shell基本操作)

運行mongo啟動shell: 
 
shell是一個功能完備的JavaScript解譯器,可運行任意的JavaScript程式。這裡不做樣本。 
MongoDB的預設資料庫為"db",該資料庫儲存在data目錄中。 
1.選擇資料庫

#選擇名test資料庫use tset

  

 
如果忘記了資料庫名稱可以輸入如下代碼查詢所有資料庫名稱:"show dbs" 命令可以顯示所有資料的列表

 
show dbs

  

 
查看資料庫中的集合名:

 
show collections

  

結果: 
 
下表列出了 RDBMS 與 MongoDB 對應的術語: 

 插入文檔

insert函數可將一個文檔插入到集合中去。以一個部落格舉例。先建立一個叫post的變數(JavaScript對象)有三個鍵和對應的屬性。插入代碼:

 
db.blog.insert(post)

: 
 
批量插入

 
db.blog.insertMany([{"_id":0},{"_id":1},{"_id":2}])

  

 查詢文檔

查詢代碼如下:

 
db.blog.find()

: 
 
多出來的"_id"就是MongoDB自動建立的預設為ObjectID類型的對象。在一個集合裡,每個文檔都由唯一的"_id",確保集合中的每個文檔都能被唯一標識,它採用12位元組的儲存空間,由24個16進位數字組成,可分為四部分組成:

{0,1,2,3} {4,5,6} {7,8} {9,10,11}
時間戳記 機器碼 PID(線程碼) 自增計數器

如果插入文檔時沒有"_id"鍵,系統會為我們自動建立一個。 
若只想查看一個文檔,可以用findOne:

db.blog.findOne()

  

查詢具體的某一個文檔那麼就要以json的形式添加查詢條件,例如:

 
db.blog.find({"title":"My Blog Post"})

  

以上執行個體中類似於 WHERE 語句:WHERE title = ‘My Blog Post‘;

 修改文檔

如果給部落格新增一個評論功能,則需要新增key-value,用於儲存評論數組。

 
post.comments = []

之後用新版本的文檔替換舊版本:

 
db.blog.update({"title":"My Blog Post"},post)

使用修改器:
"$Set":用來指定一個欄位的值,若欄位不存在,則建立它。
db.users.update({"sex":"male"},{"$Set":{"gift":"happy birthday!"}})/*這樣只會更新一個文檔,若要更新多個文檔,則需要將update的第四個參數設定為true*/db.users.update({"sex":"male"},{"$Set":{"gift":"happy birthday!"}},false,true) 
"$inc":用來增加已有鍵的值,若鍵不存在,就建立它。(與"$Set"類似,專門用來增加數位,只能用於整形,長整型,雙精確度浮點型)
db.games.update({"game":"pinball","user":"joe"},{"$inc":{"score":50}}) 
"$push":會向已有的數組末尾加入一個元素,若數組不存在,則建立數組。與"$each"自操作符一同使用可以一次添加多個值。
db.stock.ticker.update({"_id":"1"},{"$push":{"hourly":{"$each":[562.667,562.790,562.123]}}}) 
"$addToSet":可以避免重複插入。若數組內已有相同資料,則不差入。與"$each"自操作符一同使用可以一次添加多個值。
db.users.update({"_id""1},{"$addToSet":{"emails":"[email protected]"}})
"$push":刪除數組裡的元素.("$pop":將數組看成隊列或棧,從兩端刪除。"$pull":將所匹配到的數組中的值刪除,而不是只刪除一個)
刪除文檔
db.blog.remove({"title":"My Blog Post"})

 
刪除整個集合用drop()

 
db.blog.drop()
索引

MongoDB使用 ensureIndex() 方法來建立索引。

db.COLLECTION_NAME.ensureIndex({KEY:1})

文法中 Key 值為你要建立的索引欄位,1為指定按升序建立索引,如果你想按降序來建立索引指定為-1即可。 
當然也可以給多個欄位建立索引

db.col.ensureIndex({"title":1,"description":-1})
管道彙總

MongoDB的彙總管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操作是可以重複的。 
運算式:處理輸入文檔並輸出。運算式是無狀態的,只能用於計算當前彙總管道的文檔,不能處理其它的文檔。 
這裡我們介紹一下彙總架構中常用的幾個操作:

  • $project:修改輸入文檔的結構。可以用來重新命名、增加或刪除域,也可以用於建立計算結果以及嵌套文檔。
 
db.article.aggregate({ $project : {title : 1 ,author : 1 ,}});
  • $match:用於過濾資料,只輸出合格文檔。
db.articles.aggregate( [{ $match : { score : { $gt : 70, $lte : 90 } } },{ $group: { _id: null, count: { $sum: 1 } } }] );
  • $limit:用來限制MongoDB彙總管道返回的文檔數。
db.article.find().limit
  • $skip:在彙總管道中跳過指定數量的文檔,並返回餘下的文檔。
db.article.aggregate( { $skip : 5 });
  • $group:將集合中的文檔分組,可用於統計結果。

  • $sort:將輸入文檔排序後輸出。

 Java操作MongoDB 串連資料庫

串連資料庫,你需要指定資料庫名稱,如果指定的資料庫不存在,mongo會自動建立資料庫。 
所需jar包: mongo-java-driver-3.2.2.jar 
串連資料庫的Java代碼如下:

 1 import com.mongodb.MongoClient; 2 import com.mongodb.client.MongoDatabase; 3 public class MongoDBJDBC{ 4 public static void main( String args[] ){ 5 try{ 6 // 串連到 mongodb 服務 7 MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); 8 // 串連到資料庫 9 MongoDatabase mongoDatabase = mongoClient.getDatabase("test");10 System.out.println("Connect to database successfully");11 }catch(Exception e){12 System.err.println( e.getClass().getName() + ": " + e.getMessage() );13 }14 }15 }

 

建立集合: 
我們可以使用 com.mongodb.client.MongoDatabase 類中的createCollection()來建立集合 
程式碼片段如下:

 
import com.mongodb.MongoClient;import com.mongodb.client.MongoDatabase;public class MongoDBJDBC{public static void main( String args[] ){try{// 串連到 mongodb 服務MongoClient mongoClient = new MongoClient( "localhost" , 27017 );// 串連到資料庫MongoDatabase mongoDatabase = mongoClient.getDatabase("test");System.out.println("Connect to database successfully");mongoDatabase.createCollection("test");System.out.println("集合建立成功");}catch(Exception e){System.err.println( e.getClass().getName() + ": " + e.getMessage() );}}}

 

 插入文檔 
//插入文檔/*** 1. 建立文檔 org.bson.Document 參數為key-value的格式* 2. 建立文檔集合List<Document>* 3. 將文檔集合插入資料庫集合中 mongoCollection.insertMany(List<Document>) 插入單個文檔可以用 mongoCollection.insertOne(Document)* */Document document = new Document("title", "MongoDB").append("description", "database").append("likes", 100).append("by", "Fly");List<Document> documents = new ArrayList<Document>();documents.add(document);collection.insertMany(documents);System.out.println("文檔插入成功");

 

 查詢文檔 
//檢索所有文檔/*** 1. 擷取迭代器FindIterable<Document>* 2. 擷取遊標MongoCursor<Document>* 3. 通過遊標遍曆檢索出的文檔集合* */FindIterable<Document> findIterable = collection.find();MongoCursor<Document> mongoCursor = findIterable.iterator();while(mongoCursor.hasNext()){System.out.println(mongoCursor.next());}

 

 修改文檔 
//更新文檔 將文檔中likes=100的文檔修改為likes=200collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200)));//檢索查看結果FindIterable<Document> findIterable = collection.find();MongoCursor<Document> mongoCursor = findIterable.iterator();while(mongoCursor.hasNext()){System.out.println(mongoCursor.next());}

 

 刪除文檔 
//刪除合格第一個文檔collection.deleteOne(Filters.eq("likes", 200));//刪除所有合格文檔collection.deleteMany (Filters.eq("likes", 200));//檢索查看結果FindIterable<Document> findIterable = collection.find();MongoCursor<Document> mongoCursor = findIterable.iterator();while(mongoCursor.hasNext()){System.out.println(mongoCursor.next());}

 

  

MongoDB學習筆記(一)

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.