Mongodb知識樹整理【一】
簡介
- MongoDB 是一個基於分散式 檔案儲存的NoSQL資料庫
- 由C++語言編寫,執行穩定,效能高
- 旨在為 WEB 應用提供可擴充套件的高效能資料儲存解決方案
- 檢視官方網站
MongoDB特點
- 模式自由 :可以把不同結構的文件儲存在同一個資料庫裡
- 面向集合的儲存:適合儲存 JSON風格檔案的形式
- 完整的索引支援:對任何屬性可索引
- 複製和高可用性:支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目的是提供冗餘及自動故障轉移
- 自動分片:支援雲級別的伸縮性:自動分片功能支援水平的資料庫叢集,可動態新增額外的機器
- 豐富的查詢:支援豐富的查詢表達方式,查詢指令使用JSON形式的標記,可輕易查詢文件中的內嵌的物件及陣列
- 快速就地更新:查詢優化器會分析查詢表示式,並生成一個高效的查詢計劃
- 高效的傳統儲存方式:支援二進位制資料及大型物件(如照片或圖片)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
基本操作
- 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欄位設定為主鍵 |
- 三元素:資料庫,集合,文件
- 集合就是關係資料庫中的表
- 文件對應著關係資料庫中的行
- 文件,就是一個物件,由鍵值對構成,是json的擴充套件Bson形式
{'name':'guojing','gender':'男'}
- 集合:類似於關係資料庫中的表,儲存多個文件,結構不固定,如可以儲存如下文件在一個集合中
{'name':'guojing','gender':'男'}
{'name':'huangrong','age':18}
{'book':'shuihuzhuan','heros':'108'}
- 資料庫:是一個集合的物理容器,一個數據庫中可以包含多個文件
- 一個伺服器通常有多個數據庫
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
安裝
- 下載mongodb的版本,兩點注意
- 根據業界規則,偶數為穩定版,如1.6.X,奇數為開發版,如1.7.X
- 32bit的mongodb最大隻能存放2G的資料,64bit就沒有限制
- 到官網,選擇合適的版本下載
- 解壓
tar -zxvf mongodb-linux-x86_64-ubuntu1604-3.4.0.tgz
- 移動到/usr/local/目錄下
sudo mv -r mongodb-linux-x86_64-ubuntu1604-3.4.0/ /usr/local/mongodb
- 將可執行檔案新增到PATH路徑中
export PATH=/usr/local/mongodb/bin:$PATH
管理mongo
- 配置檔案在/etc/mongod.conf
-
預設埠27017
-
啟動
#啟動
sudo service mongod start
#測試是否啟動成功
ps ajx|grep mongod
- 停止
sudo service mongod stop
- 使用終端連線
- 這個shell就是mongodb的客戶端,同時也是一個js的編譯器
mongo
- 命令
db檢視當前資料庫名稱
db.stats()檢視當前資料庫資訊
- 終端退出連線
exit
或ctrl+c
- GUI:robomongo,解壓後在bin目錄下找到執行程式
- 介面如下:
--------------------------------------------------------------------------------------------------------------------------------------------------------------------
資料庫切換
- 檢視當前資料庫名稱
db
- 檢視所有資料庫名稱
- 列出所有在物理上存在的資料庫
show dbs
- 切換資料庫
- 如果資料庫不存在,則指向資料庫,但不建立,直到插入資料或建立集合時資料庫才被建立
use 資料庫名稱
- 預設的資料庫為test,如果你沒有建立新的資料庫,集合將存放在test資料庫中
資料庫刪除
- 刪除當前指向的資料庫
- 如果資料庫不存在,則什麼也不做
db.dropDatabase()
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
集合建立
- 語法
db.createCollection(name, options)
- name是要建立的集合的名稱
- options是一個文件,用於指定集合的配置
- 選項引數是可選的,所以只需要到指定的集合名稱。以下是可以使用的選項列表:
- 例1:不限制集合大小
db.createCollection("stu")
- 例2:限制集合大小,後面學會插入語句後可以檢視效果
- 引數capped:預設值為false表示不設定上限,值為true表示設定上限
- 引數size:當capped值為true時,需要指定此引數,表示上限大小,當文件達到上限時,會將之前的資料覆蓋,單位為位元組
db.createCollection("sub", { capped : true, size : 10 } )
檢視當前資料庫的集合
- 語法
show collections
刪除
- 語法
db.集合名稱.drop()
----------------------------------------------------------------------------------------------------------------------------------------------------------------------
資料型別
- 下表為MongoDB中常用的幾種資料型別:
- Object ID:文件ID
- String:字串,最常用,必須是有效的UTF-8
- Boolean:儲存一個布林值,true或false
- Integer:整數可以是32位或64位,這取決於伺服器
- Double:儲存浮點值
- Arrays:陣列或列表,多個值儲存到一個鍵
- Object:用於嵌入式的文件,即一個值為一個文件
- Null:儲存Null值
- Timestamp:時間戳
- Date:儲存當前日期或時間的UNIX時間格式
object id
- 每個文件都有一個屬性,為_id,保證每個文件的唯一性
- 可以自己去設定_id插入文件
- 如果沒有提供,那麼MongoDB為每個文件提供了一個獨特的_id,型別為objectID
- objectID是一個12位元組的十六進位制數
- 前4個位元組為當前時間戳
- 接下來3個位元組的機器ID
- 接下來的2個位元組中MongoDB的服務程序id
- 最後3個位元組是簡單的增量值
- ------------------------------------------------------------------------------------------------------------------------------------------------------------------
插入
- 語法
-
db.集合名稱.insert(document)
- 插入文件時,如果不指定_id引數,MongoDB會為文件分配一個唯一的ObjectId
- 例1
-
db.stu.insert({name:'gj',gender:1})
- 例2
-
s1={_id:'20160101',name:'hr'} s1.gender=0 db.stu.insert(s1)
簡單查詢
- 語法
-
db.集合名稱.find()
更新
- 語法
-
db.集合名稱.update( <query>, <update>, {multi: <boolean>} )
- 引數query:查詢條件,類似sql語句update中where部分
- 引數update:更新操作符,類似sql語句update中set部分
- 引數multi:可選,預設是false,表示只更新找到的第一條記錄,值為true表示把滿足條件的文件全部更新
- 例3:全文件更新[如果不適用$set 會是文件的結構也發生改變]
-
db.stu.update({name:'hr'},{name:'mnc'})
- 例4:指定屬性更新,通過操作符$set
-
db.stu.insert({name:'hr',gender:0}) db.stu.update({name:'hr'},{$set:{name:'hys'}})
- 例5:修改多條匹配到的資料
db.stu.update({},{$set:{gender:0}},{multi:true})
儲存
- 語法
db.集合名稱.save(document)
-
如果文件的_id已經存在則修改,如果文件的_id不存在則新增
-
例6
db.stu.save({_id:'20160102','name':'yk',gender:1})
- 例7
db.stu.save({_id:'20160102','name':'wyk'})
刪除
- 語法
db.集合名稱.remove(
<query>,
{
justOne: <boolean>
}
)
- 引數query:可選,刪除的文件的條件
- 引數justOne:可選,如果設為true或1,則只刪除一條,預設false,表示刪除多條
- 例8:只刪除匹配到的第一條
db.stu.remove({gender:0},{justOne:true})
- 例9:全部刪除
db.stu.remove({})
-------------------------------------------------------------------------------------------------------------------------------------------------------------
資料查詢
基本查詢
- 方法find():查詢
db.集合名稱.find({條件文件})
- 方法findOne():查詢,只返回第一個
db.集合名稱.findOne({條件文件})
- 方法pretty():將結果格式化
db.集合名稱.find({條件文件}).pretty()
比較運算子
- 等於,預設是等於判斷,沒有運算子
- 小於$lt
- 小於或等於$lte
- 大於$gt
- 大於或等於$gte
- 不等於$ne
- 例1:查詢名稱等於'gj'的學生
db.stu.find({name:'gj'})
- 例2:查詢年齡大於或等於18的學生
db.stu.find({age:{$gte:18}})
邏輯運算子
- 查詢時可以有多個條件,多個條件之間需要通過邏輯運算子連線
- 邏輯與:預設是邏輯與的關係
- 例3:查詢年齡大於或等於18,並且性別為1的學生
db.stu.find({age:{$gte:18},gender:1})
- 邏輯或:使用$or
- 例4:查詢年齡大於18,或性別為0的學生
db.stu.find({$or:[{age:{$gt:18}},{gender:1}]})
- and和or一起使用
- 例5:查詢年齡大於18或性別為0的學生,並且學生的姓名為gj
db.stu.find({$or:[{age:{$gte:18}},{gender:1}],name:'gj'})
範圍運算子
- 使用"$in","$nin" 判斷是否在某個範圍內
- 例6:查詢年齡為18、28的學生
db.stu.find({age:{$in:[18,28]}})
支援正則表示式
- 使用//或$regex編寫正則表示式
- 例7:查詢姓黃的學生
db.stu.find({name:/^黃/})
db.stu.find({name:{$regex:'^黃'}}})
自定義查詢
- 使用$where後面寫一個函式,返回滿足條件的資料
- 例7:查詢年齡大於30的學生
db.stu.find({$where:function(){return this.age>20}})
-----------------------------------------------------------------------------------------------------------------------------------------------------------------------
Limit
- 方法limit():用於讀取指定數量的文件
- 語法:
db.集合名稱.find().limit(NUMBER)
- 引數NUMBER表示要獲取文件的條數
- 如果沒有指定引數則顯示集合中的所有文件
- 例1:查詢2條學生資訊
db.stu.find().limit(2)
skip
- 方法skip():用於跳過指定數量的文件
- 語法:
db.集合名稱.find().skip(NUMBER)
- 引數NUMBER表示跳過的記錄條數,預設值為0
- 例2:查詢從第3條開始的學生資訊
db.stu.find().skip(2)
一起使用
-
方法limit()和skip()可以一起使用,不分先後順序
-
建立資料集
for(i=0;i<15;i++){db.t1.insert({_id:i})}
- 查詢第5至8條資料
db.stu.find().limit(4).skip(5)
或
db.stu.find().skip(5).limit(4)
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
投影
- 在查詢到的返回結果中,只選擇必要的欄位,而不是選擇一個文件的整個欄位
- 如:一個文件有5個欄位,需要顯示只有3個,投影其中3個欄位即可
- 語法:
- 引數為欄位與值,值為1表示顯示,值為0不顯示
db.集合名稱.find({},{欄位名稱:1,...})
- 對於需要顯示的欄位,設定為1即可,不設定即為不顯示
- 特殊:對於_id列預設是顯示的,如果不顯示需要明確設定為0
- 例1
db.stu.find({},{name:1,gender:1})
- 例2
db.stu.find({},{_id:0,name:1,gender:1})
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
排序
- 方法sort(),用於對結果集進行排序
- 語法
db.集合名稱.find().sort({欄位:1,...})
- 引數1為升序排列
- 引數-1為降序排列
- 例1:根據性別降序,再根據年齡升序
db.stu.find().sort({gender:-1,age:1})
------------------------------------------------------------------------------------------------------------------------------------------------------------------------
統計個數
- 方法count()用於統計結果集中文件條數
- 語法
db.集合名稱.find({條件}).count()
- 也可以與為
db.集合名稱.count({條件})
- 例1:統計男生人數
db.stu.find({gender:1}).count()
- 例2:統計年齡大於20的男生人數
db.stu.count({age:{$gt:20},gender:1})
-------------------------------------------------------------------------------------------------------------------------------------------------------------------
消除重複
- 方法distinct()對資料進行去重
- 語法
db.集合名稱.distinct('去重欄位',{條件})
- 例1:查詢年齡大於18的性別(去重)
db.stu.distinct('gender',{age:{$gt:18}})