1. 程式人生 > >(轉)MongoDB學習

(轉)MongoDB學習

(二期)25、分散式檔案儲存資料庫MongoDB

【課程25】mongod...命令.xmind96.9KB

【課程25】MongoD...概念.xmind0.5MB

【課程25】MongoDB簡介.xmind93.8KB

【課程25】mongod...ysql.xmind0.3MB

【課程25】springb...godb.xmind79.2KB

【課程25預習】MongoDB.xmind0.1MB

 

官網

官網入門教程:https://university.mongodb.com/

中文社群:http://www.mongoing.com/

視覺化客戶端robomongo:

https://robomongo.org/download

 

百度百科

MongoDB是一個基於分散式檔案儲存的資料庫。由C++語言編寫。旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案。

 

mongoDB是一個介於關係資料庫和非關係資料庫之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。它支援的資料結構非常鬆散,是類似json的bson格式,因此可以儲存比較複雜的資料型別。

 

Mongo最大的特點是它支援的查詢語言非常強大,其語法有點類似於面向物件的查詢語言,幾乎可以實現類似關係資料庫單表查詢的絕大部分功能,而且還支援對資料建立索引。

特點

MongoDB適合儲存一些關係簡單、資料量又很大的資料。

 

它的特點是高效能、易部署、易使用,儲存資料非常方便。主要功能特性有:

 

*面向集合儲存,易儲存物件型別的資料。

*模式自由。

*支援動態查詢。

*支援完全索引,包含內部物件。

*支援查詢。

*支援複製和故障恢復。

*使用高效的二進位制資料儲存,包括大型物件(如視訊等)。

*自動處理碎片,以支援雲端計算層次的擴充套件性。

*支援RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。

*檔案儲存格式為BSON(一種JSON的擴充套件)。

*可通過網路訪問。

 

最大缺點

  • 不支援事務,靠客戶端自身保證
  • 新版本已經開始支援事務機制
場景使用 適用場景

1)網站實時資料處理。它非常適合實時的插入、更新與查詢,並具備網站實時資料儲存所需的複製及高度伸縮性。

2)快取。由於效能很高,它適合作為資訊基礎設施的快取層。在系統重啟之後,由它搭建的持久化快取層可以避免下層的資料來源過載。

3)高伸縮性的場景。非常適合由數十或數百臺伺服器組成的資料庫,它的路線圖中已經包含對MapReduce引擎的內建支援。

不適用的場景

1)要求高度事務性的系統。

2)傳統的商業智慧應用。

3)複雜的跨文件(表)級聯查詢。

基本概念

不管我們學習什麼資料庫都應該學習其中的基礎概念,在mongodb中基本的概念是文件、集合、資料庫。

下面我們挨個介紹:

直觀用例:

資料庫

一個mongodb中可以建立多個數據庫。

MongoDB的預設資料庫為"db",該資料庫儲存在data目錄中。

MongoDB的單個例項可以容納多個獨立的資料庫,每一個都有自己的集合和許可權,不同的資料庫也放置在不同的檔案中。

 

"show dbs" 命令可以顯示所有資料的列表。

 

資料庫名可以是滿足以下條件的任意UTF-8字串。

  • 不能是空字串("")。
  • 不得含有' '(空格)、.、$、/、\和\0 (空字元)。
  • 應全部小寫。
  • 最多64位元組。

有一些資料庫名是保留的,可以直接訪問這些有特殊作用的資料庫。

  • admin: 從許可權的角度來看,這是"root"資料庫。要是將一個使用者新增到這個資料庫,這個使用者自動繼承所有資料庫的許可權。一些特定的伺服器端命令也只能從這個資料庫執行,比如列出所有的資料庫或者關閉伺服器。
  • local: 這個資料永遠不會被複制,可以用來儲存限於本地單臺伺服器的任意集合
  • config: 當Mongo用於分片設定時,config資料庫在內部使用,用於儲存分片的相關資訊。
文件

文件是一組鍵值(key-value)對(即BSON)。MongoDB 的文件不需要設定相同的欄位,並且相同的欄位不需要相同的資料型別,這與關係型資料庫有很大的區別,也是 MongoDB 非常突出的特點。

集合

集合就是 MongoDB 文件組,類似於 RDBMS (關係資料庫管理系統:Relational Database Management System)中的表格。

 

集合存在於資料庫中,集合沒有固定的結構,這意味著你在對集合可以插入不同格式和型別的資料,但通常情況下我們插入集合的資料都會有一定的關聯性。

資料型別

一個MongoDB 例項可以包含一組資料庫,一個DataBase 可以包含一組Collection(集合),一個集合可以包含一組Document(文件)。一個Document包含一組field(欄位),每一個欄位都是一個key/value pair。

key: 必須為字串型別。

value:可以包含如下型別。

● 基本型別,例如,string,int,float,timestamp,binary 等型別。

● 一個document。

● 陣列型別。

資料關聯

關係模型和文件模型的區別在哪裡?

  • 關係模型需要你把一個數據物件,拆分成零部件,然後存到各個相應的表裡,需要的是最後把它拼起來。舉例子來說,假設我們要做一個CRM應用,那麼要管理客戶的基本資訊,包括客戶名字、地址、電話等。由於每個客戶可能有多個電話,那麼按照第三正規化,我們會把電話號碼用單獨的一個表來儲存,並在顯示客戶資訊的時候通過關聯把需要的資訊取回來。
  • 而MongoDB的文件模式,與這個模式大不相同。由於我們的儲存單位是一個文件,可以支援陣列和巢狀文件,所以很多時候你直接用一個這樣的文件就可以涵蓋這個客戶相關的所有個人資訊。關係型資料庫的關聯功能不一定就是它的優勢,而是它能夠工作的必要條件。 而在MongoDB裡面,利用富文件的性質,很多時候,關聯是個偽需求,可以通過合理建模來避免做關聯。

文件模型優點:

  • 讀寫效率高-由於文件模型把相關資料集中在一塊,在普通機械盤上讀資料的時候不用花太多時間去定位磁頭,因此在IO效能上有先天獨厚的優勢;
  • 可擴充套件能力強-關係型資料庫很難做分散式的原因就是多節點海量資料關聯有巨大的效能問題。如果不考慮關聯,資料分割槽分庫,水平擴充套件就比較簡單;
  • 動態模式-文件模型支援可變的資料模式,不要求每個文件都具有完全相同的結構。對很多異構資料場景支援非常好;
  • 模型自然-文件模型最接近於我們熟悉的物件模型。從記憶體到儲存,無需經過ORM的雙向轉換,效能上和理解上都很自然易懂。
MongoBD的安裝

官網下載地址:(因為最新版本的配置有些不一樣,所以這裡介紹3.4版本的mongodb)

https://www.mongodb.org/dl/linux/x86_64-rhel70

 

下載之後解壓改名:

tar -zxvf mongodb-linux-x86_64-rhel70-v3.4-latest.tgz

mv mongodb-linux-x86_64-rhel70-v3.4 mongodb

配置:

解壓之後,建立data/db、logs目錄分別用來存放資料和日誌。

進入到bin目錄下,編輯mongodb.conf檔案,內容如下:

dbpath = /opt/mongodb/data/db #資料檔案存放目錄
logpath = /opt/mongodb/logs/mongodb.log #日誌檔案存放目錄
port = 27017  #埠
fork = true  #以守護程式的方式啟用,即在後臺執行
nohttpinterface =true
bind_ip = 0.0.0.0 #默然只能127.0.0.1能夠訪問mongodb,如果遠端的話可以設定指定ip,這裡表示任何機器都可以訪問
 
  

啟動monogdb,使用./mongod -f mongodb.conf

進入mongodb的控制檯命令:./mongo,會輸出當前的mongodb的版本號等資訊。

關閉服務

使用db.shutdownServer();命令可以關閉到MongoDB服務,但是這個命令的執行要在admin資料庫下,所以先切換到admin,再關閉服務。退出之後,就進入不了了。

資料庫操作 建立資料庫
use DATABASE_NAME

如果資料庫不存在,則建立資料庫,否則切換到指定資料庫。

我們剛建立的資料庫 runoob 並不在資料庫的列表中, 要顯示它,我們需要向 runoob 資料庫插入一些資料。

刪除資料庫
db.dropDatabase()
建立賬號授權

集合操作 建立集合
db.createCollection(name, options)

引數說明:

  • name: 要建立的集合名稱
  • options: 可選引數, 指定有關記憶體大小及索引的選項

options引數:

截圖:

刪除集合
db.collection.drop()
文件操作 建立文件

MongoDB 使用 insert() 或 save() 方法向集合中插入文件

#語法
db.COLLECTION_NAME.insert(document)
 
  
#例項
db.col.insert({title: 'MongoDB 教程', 
    description: 'MongoDB 是一個 Nosql 資料庫',
    by: '菜鳥教程',
    url: 'http://www.runoob.com',
    tags: ['mongodb', 'database', 'NoSQL'],
    likes: 100
})

以上例項中 col 是我們的集合名,如果該集合不在該資料庫中, MongoDB 會自動建立該集合並插入文件

 

檢視已插入文件:

db.col.find()
{ "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 資料庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
> 
更新文件

update() 方法用於更新已存在的文件。語法格式如下:

db.collection.update(
   <query>,
   <update>,
   {
     upsert: <boolean>,
     multi: <boolean>,
     writeConcern: <document>
   }
)
 
  
#例項
db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}})
 
  

save() 方法通過傳入的文件來替換已有文件,語法如下:

db.collection.save(
   <document>,
   {
     writeConcern: <document>
   }
)
 
  
#例項
db.col.save({
    "_id" : ObjectId("56064f89ade2f21f36b03136"),
    "title" : "MongoDB",
    "description" : "MongoDB 是一個 Nosql 資料庫",
    "by" : "Runoob",
    "url" : "http://www.runoob.com",
    "tags" : [
            "mongodb",
            "NoSQL"
    ],
    "likes" : 110
})
 
  

引數說明:

  • query : update的查詢條件,類似sql update查詢內where後面的。
  • update : update的物件和一些更新的操作符(如$,$inc...)等,也可以理解為sql update查詢內set後面的
  • upsert : 可選,這個引數的意思是,如果不存在update的記錄,是否插入objNew,true為插入,預設是false,不插入。
  • multi : 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個引數為true,就把按條件查出來多條記錄全部更新。
  • writeConcern :可選,丟擲異常的級別。

更多例項

只更新第一條記錄:

db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

全部更新:

db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

只新增第一條:

db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

全部新增加進去:

db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

全部更新:

db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

只更新第一條記錄:

db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );

刪除文件

remove() 方法的基本語法格式如下所示:

db.collection.remove(
   <query>,
   {
     justOne: <boolean>,
     writeConcern: <document>
   }
)
 
  
#例項
db.col.remove({'title':'MongoDB 教程'})
 
  

引數說明:

  • query :(可選)刪除的文件的條件。
  • justOne : (可選)如果設為 true 或 1,則只刪除一個文件。
  • writeConcern :(可選)丟擲異常的級別。

說明

remove() 方法已經過時了,現在官方推薦使用 deleteOne() 和 deleteMany() 方法。

如刪除集合下全部文件:

db.inventory.deleteMany({})

刪除 status 等於 A 的全部文件:

db.inventory.deleteMany({ status : "A" })

刪除 status 等於 D 的一個文件:

db.inventory.deleteOne( { status: "D" } )

 

常用關鍵字

$gt 大於

$lt 小於

$ne 不等於

$gte 大於或等於

$lte 小於或等於

$inc 可以對文件的某個值為數字型(只能為滿足要求的數字)的鍵進行增減的操作。

$in 相當於T-SQL中的in

$nin 相當於T-SQL中的not in

 

db.b.update({"uid" : "20120002"},{"$inc":{"size" : 1}})

 

$set用來指定一個鍵並更新鍵值,若鍵不存在並建立。

db.a.update({"uid" : "20120002"},{"$set":{"size":10}})

 

$unset主要是用來刪除鍵。

db.a.update({"uid" : "20120002"},{"$unset":{"sname":"abc"}})

 

$push向陣列新增新的值。如果鍵值不存在,則建立一個。

db.c.update({"name" : "toyota"},{$push:{"title":"t1"}})

 

$addToSet主要給陣列型別鍵值新增一個元素時,避免在陣列中產生重複資料。

db.c.update({"name" : "toyota"},{$addToSet:{"title":"t2"}})

 

$pop從陣列的頭或者尾刪除陣列中的元素

db.c.update({"name" : "toyota"},{$pop:{"title":1}})

 

$pull從陣列中刪除滿足條件的元素

db.c.update({"name" : "toyota"},{$pull:{"title":"t2"}})
與RDBMS相比  

操作

格式

範例

RDBMS中的類似語句

等於

{<key>:<value>}

db.col.find({"by":"菜鳥教程"}).pretty()

where by = '菜鳥教程'

小於

{<key>:{$lt:<value>}}

db.col.find({"likes":{$lt:50}}).pretty()

where likes < 50

小於或等於

{<key>:{$lte:<value>}}

db.col.find({"likes":{$lte:50}}).pretty()

where likes <= 50

大於

{<key>:{$gt:<value>}}

db.col.find({"likes":{$gt:50}}).pretty()

where likes > 50

大於或等於

{<key>:{$gte:<value>}}

db.col.find({"likes":{$gte:50}}).pretty()

where likes >= 50

不等於

{<key>:{$ne:<value>}}

db.col.find({"likes":{$ne:50}}).pretty()

where likes != 50

索引

createIndex()方法基本語法格式如下所示:

>db.collection.createIndex(keys, options)
 
  
#例項
db.col.createIndex({"title":1})
 
  
#複合索引
db.col.createIndex({"title":1,"description":-1})
 
  

createIndex() 接收可選引數,可選引數列表如下:

常用命令

可參考文章:http://www.cnblogs.com/garinzhang/p/mongoDB_basic_usage.html

 

1、Help檢視命令提示

 help

 db.help();

 db.yourColl.help();

 db.youColl.find().help();

 rs.help();

 

2、切換/建立資料庫

 use yourDB;  當建立一個集合(table)的時候會自動建立當前資料庫

 

3、查詢所有資料庫

 show dbs;

 

4、刪除當前使用資料庫

 db.dropDatabase();

 

5、從指定主機上克隆資料庫

 db.cloneDatabase("127.0.0.1"); 將指定機器上的資料庫的資料克隆到當前資料庫

 

6、從指定的機器上覆制指定資料庫資料到某個資料庫

 db.copyDatabase("mydb", "temp", "127.0.0.1");將本機的mydb的資料複製到temp資料庫中

 

7、修復當前資料庫

 db.repairDatabase();

 

8、檢視當前使用的資料庫

 db.getName();

 db; dbgetName方法是一樣的效果,都可以查詢當前使用的資料庫

 

9、顯示當前db狀態

 db.stats();

 

10、當前db版本

 db.version();

 

11、檢視當前db的連結機器地址

 db.getMongo();

Collection聚集集合

1、建立一個聚集集合(table

 db.createCollection("collName", {size: 20, capped: 5, max: 100});

2、得到指定名稱的聚集集合(table

 db.getCollection("account");

3、得到當前db的所有聚集集合

 db.getCollectionNames();

4、顯示當前db所有聚集索引的狀態

 db.printCollectionStats();

 

 使用者相關

1、新增一個使用者

 db.addUser("name");

 db.addUser("userName", "pwd123", true); 新增使用者、設定密碼、是否只讀

2、資料庫認證、安全模式

 db.auth("userName", "123123");

3顯示當前所有使用者

 show users;

4、刪除使用者

 db.removeUser("userName");

 

其他

1、查詢之前的錯誤資訊

 db.getPrevError();

2、清除錯誤