MongoDB快速入門 Author:SimpleWu MongoDB官方網:https://www.mongodb.com/ MongoDB中文網:http://www.mongodb.org.cn/ 什麼是MongoDB? NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是 ...
MongoDB快速入門
Author:SimpleWu
MongoDB官方網:https://www.mongodb.com/
MongoDB中文網:http://www.mongodb.org.cn/
什麼是MongoDB?
NoSQL(NoSQL = Not Only SQL ),意即"不僅僅是SQL"。
NoSQL,指的是非關係型的資料庫。NoSQL有時也稱作Not Only SQL的縮寫,是對不同於傳統的關係型資料庫的資料庫管理系統的統稱。
NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook每天為他們的用戶收集萬億比特的數據)。這些類型的數據存儲不需要固定的模式,無需多餘操作就可以橫向擴展。
NoSQL 是一項全新的資料庫革命性運動,早期就有人提出,發展至2009年趨勢越發高漲。NoSQL的擁護者們提倡運用非關係型的數據存儲,相對於鋪天蓋地的關係型資料庫運用,這一概念無疑是一種全新的思維的註入。
而MongoDB就不僅僅是SQL。
MongoDB是一個基於分散式文件存儲的資料庫。由C++語言編寫。旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB是一個介於關係資料庫和非關係資料庫(nosql)之間的產品,是非關係資料庫當中功能最豐富,最像關係資料庫的。
MongoDB將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似於 JSON 對象。欄位值可以包含其他文檔,數組及文檔數組。
MongoDB概念
SQL術語/概念 | MongoDB術語/概念 | 解釋/說明 |
---|---|---|
database | database | 資料庫 |
table | collection | 資料庫表/集合 |
row | document | 數據記錄行/文檔 |
column | field | 數據欄位/域 |
index | index | 索引 |
table joins | 表連接,MongoDB不支持 | |
primary key | primary key | 主鍵,MongoDB自動將_id欄位設置為主鍵 |
MongoDB安裝
官方下載網站:https://www.mongodb.com/download-center/community,支持N多平臺操作系統。
我們這裡下載MongoDB的3.4,windows64位操作系統的解壓包,ZIP是綠色版,MSI是安裝版。
安裝一路next就成。
4個文件是協議不需要管,bin目錄裡面的是可執行文件,但是這個時候我們是無法使用mongodb的,我們還是要將它添加到環境變數中。
創建一個MongoDB_HOME=D:\JAVA\mongodb,然後在將%MongoDB_HOME%\bin加入到path目錄
這個時候我們運行cmd打開小黑屋運行命名:mongod,這個時候運行是失敗的:
錯誤原因是:c:data\db\這個目錄不存在,最簡單的辦法就是創建一個,不過個人不喜歡把文件放在C盤,並且以這種方式啟動會一直有個視窗感覺非常不爽。
在服務中運行:
我們首先在mongoDB安裝後的bin目錄里創建一個mongod.cfg,裡面添加如下內容
systemLog:
destination: file
path: D:\JAVA\mongodb\log\mongodb.log #如果沒有目錄必須要創建
storage:
dbPath: D:\JAVA\mongodb\db\ #如果沒有目錄必須要創建
使用mongod --config "D:\JAVA\mongodb\bin\mongod.cfg" –install --serviceName "MongoDB" 安裝服務,需要管理員許可權。
芒果DB服務命令:
net start MongoDB #啟動服務
net stop MongoDB #關閉服務
mongod –remove #移除服務(需要管理員許可權。)
sc delete MongoDB 刪除服務
我們使用命令之後這個時候我們的服務中會有個MongoDB服務並且在運行中。
這個時候我們就可以使用命令mongo連接上我們的資料庫。
附上一張mongoDB參數列表圖:
使用MongoDB的時候如果不喜歡黑視窗的可以去度娘問問gui界面。
資料庫指令
/*查看當前資料庫*/
show dbs;
/* 如果資料庫不存在,則創建資料庫,否則切換到指定資料庫。
註意:這裡的資料庫並不是一定要存在的,如果不存在,在創建文檔時會自動創建。
*/
use MyDB;
/*刪除當前數據*/
MyDB.dropDatabase();
/*顯示當前所在數據*/
db;
集合操作指令
查看當前所有集合: show collections;
創建集合語法: db.createCollection(name,options)
name:集合的名稱,options:可選參數,指定有關記憶體大小及索引的選項。
刪除集合語法:db.集合名.drop()
常用命令操作
Employee是我創建的一個集合
插入一條文檔:
db.Employee.insertOne({name:"SimpleWu",Email:"[email protected]",QQ:450255266});
插入多條文檔:
db.Employee.insertMany([
{
name:"李白",
Email:"[email protected]",
QQ:123456789
},
{
name:"韓信",
Email:"[email protected]",
QQ:987654231
}
]);
插入一條文檔或插入多條文檔:
db.Employee.insert({name:"武則天",Email:"[email protected]",QQ:1111111});
db.Employee.insert([
{
name:"嬴政",
Email:"[email protected]",
QQ:555555
},
{
name:"安琪拉",
Email:"[email protected]",
QQ:66666
}
])
批量插入文檔:
for(var i = 0 ; i <= 50000 ; i ++ ){
db.Employee2.insert({num:"魯班" + i + "號"});
}
註意我們這樣插入文檔50000條數據花費了將近20秒這是非常殘酷的,我而我們可以這樣優化,優化後只需要0.5秒。
var array = [];
for(var i = 0;i<=50000;i++){
array.push({num:"魯班"+ i +"號"});
}
db.Employee2.insert(array);
查詢文檔:
db.Employee.find();
註意:如果在插入時,不指定_id屬性,則資料庫會自動生成一個_id,取值為ObjectId()。如果指定了_id,則不會生成。
更新文檔語法:
db.collection.update(
<query>,
<update>,
{
upsert: <boolean>,
multi: <boolean>,
writeConcern: <document>
}
)
multi : 可選,mongodb 預設是false,只更新找到的第一條記錄,如果這個參數為true,就把按條件查出來多條記錄全部更新。writeConcern :可選,拋出異常的級別。
update預設會用update的對象替換原有對象:
db.Employee.update({name:"李白"},{name:"李小白"});
如果想修改指定的屬性,而不是修改所有內容,則要使用修改操作符。 $set可以用來修改指定屬性
db.Employee.update({name:"李小白"},{$set:{name:"李白"}});
$unset可以移除某個屬性,移除屬性的值可以隨便填
db.Employee.update({name:"武則天"},{$unset:{QQ:""}});
如果匹配到多個,update也只會刪除一條記錄。要刪除多條,需要使用multi屬性
db.Employee.update({name:"SimpleWu"},{$set:{name:"LovelyWu"}},{mluti:true});
save() 方法通過傳入的文檔來替換已有文檔。語法格式如下:
db.collection.save(
<document>,
{
writeConcern: <document>
}
)
document : 文檔數據。 writeConcern :可選,拋出異常的級別。
註意:若新增數據的主鍵已經存在,則會對當前已經存在的數據進行修改操作。
插入:
db.Employee.save({name:"SimpleWu",gender:"男",email:"[email protected]"});
/*
_id存在變成更新操作
*/
db.Employee.save({ _id:ObjectId("5bf7b8cde756c09cc38dd79f"),name:"Wu帥帥",gender:"男",email:"[email protected]"});
刪除文檔語法remove() 方法:
db.collection.remove(
<query>,
{
justOne: <boolean>,
writeConcern: <document>
}
)
- query :(可選)刪除的文檔的條件。
- justOne : (可選)如果設為 true 或 1,則只刪除一個文檔。
- writeConcern :(可選)拋出異常的級別。
db.Employee.remove({gender:"男"});//刪除所有符合條件的文檔
db.Employee.remove({gender:"男"},{justOne:true});//刪除一條
db.Employee.remove();//刪除集合中所有文檔
查詢文檔:
db.collection.find(query, projection)
參數說明query :可選,使用查詢操作符指定查詢條件
projection :可選,使用投影操作符指定返回的鍵。查詢時返迴文檔中所有鍵值, 只需省略該參數即可(預設省略)。
如果你需要以易讀的方式來讀取數據,可以使用 pretty() 方法,語法格式如下:db.col.find().pretty()
db.Employee.find({name:"SimpleWu"},{gender:0});//查詢name是SimpleWu的文檔數據,排除gender顯示
db.Employee.find({name:"SimpleWu"},{gender:1});//查詢name是SimpleWu的文檔數據,只顯示gender
註意這個0代表的就是排除,1代表的是要它不要其他的,在這裡0和1不能混合使用
在這裡需要註意不管是不是只顯示gender反正我們的_id是特殊的一列,所以我們沒有排除_id它絕對會顯示出來
那麼我們只要顯示gender:1怎麼辦呢很簡單在加個_id=1,但是上面不是說不能0和1混合使用嗎?
在mongoDB中,主鍵是特殊的一個欄位
條件運算符:
等值判斷 $eq:
db.Employee.find({name:"SimpleWu"});
db.Employee.find({name:{$eq:"SimpleWu"}});
判斷小於$lt:
db.Employee.find({QQ:{$lt:450255266}});
判斷大於$gt:
db.Employee.find({QQ:{$gt:450255266}});
判斷小於等於$elt:
db.Employee.find({QQ:{$elt:450255266}});
判斷大於等於egt:
db.Employee.find({QQ:{$egt:450255266}});
與條件判斷:
//判斷name=SimpleWu 同時gender=男
db.Employee.find({name:"SimpleWu",gender:"男"});
或條件判斷:
db.Employee.find({$or:[{name:"武則天"},{name:"SimpleWu"}]});
學習某一項技術首先查詢官方文檔,官方文檔是最全的,並且跟著官方文檔走可以讓我們少掉進許多坑。
總結:
文檔是Mongodb中的最基本數據單元,類似於關係資料庫中的行。
在mongodb中,文檔的鍵通常都是字元串。Mongodb對文檔的鍵是區分大小寫的,對鍵值是區分數據類型的
MongoDB的文件存儲格式為BSON,同JSON一樣支持往其它文檔對象和數組中再插入文檔對象和數組,同時擴展了JSON的數據類型.與資料庫打交 道的那些應用。
MongoDB文檔的欄位非常靈活