什么是Mongodb數據庫?
- MongoDB 是由C++語言編寫的,是一個基于分布式文件存儲的開源數據庫系統
- MongoDB 旨在為WEB應用提供可擴展的高性能數據存儲解決方案。
- MongoDB 將數據存儲為一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔類似于 JSON 對象。字段值可以包含其他文檔,數組及文檔數組。
MongoDB特點
- 模式自由 :可以把不同結構的文檔存儲在同一個數據庫里
- 面向集合的存儲:適合存儲 JSON風格文件的形式
- 完整的索引支持:對任何屬性可索引
- 復制和高可用性:支持服務器之間的數據復制,支持主-從模式及服務器之間的相互復制。復制的主要目的是提供冗余及自動故障轉移
- 自動分片:支持云級別的伸縮性:自動分片功能支持水平的數據庫集群,可動態添加額外的機器
- 豐富的查詢:支持豐富的查詢表達方式,查詢指令使用JSON形式的標記,可輕易查詢文檔中的內嵌的對象及數組
- 快速就地更新:查詢優化器會分析查詢表達式,并生成一個高效的查詢計劃
- 高效的傳統存儲方式:支持二進制數據及大型對象(如照片或圖片)
基本操作
三元素
數據庫:數據庫是一個集合的物理容器,一個數據庫中可以包含多個集合
注:1.不能是空字符串("")。
2.不得含有' '(空格)、.、$、/、\和\0 (空宇符)。
3.應全部小寫。
4.最多64字節集合:集合就是關系數據庫中的表;類似于關系數據庫中的表,儲存多個文檔,結構不固定,如可以存儲如下文檔在一個集合中 {'name':'guojing','gender':'男'} {'name':'huangrong','age':18} {'book':'shuihuzhuan','heros':'108’}
注:1.集合名不能是空字符串""。
2.集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
3.集合名不能以"system."開頭,這是為系統集合保留的前綴。
4.用戶創建的集合名字不能含有保留字
符。有些驅動程序的確支持在集合名里面包
含,這是因為某些系統生成的集合中包含該
字符。除非你要訪問這種系統創建的集合,
否則千萬不要在名字里出現$。文檔:文檔對應著關系數據庫中的行;就是一個對象,由鍵值對構成,是json的擴展Bson形式 {'name':'guojing','gender':'男’}
注:1.文檔中的鍵/值對是有序的。
2.文檔中的值不僅可以是在雙引號里
面的字符串,還可以是其他幾種數據類
型(甚至可以是整個嵌入的文檔)。
3.MongoDB區分類型和大小寫。
4.MongoDB的文檔不能有重復的鍵。
5.文檔的鍵是字符串。除了少數例外情況,鍵可以使用任意UTF-8字符。
6.文檔鍵命名規范:鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾;和$有特別的意義,只有在特定環境下才能使用。
數據庫基本命令
查看當前數據庫名稱
db列出所有在物理上存在的數據庫
show dbs切換數據庫 如果數據庫不存在,則指向數據庫,但不創建,直到插入數據或創建集合時數據庫才被創建
use 數據庫名稱查看當前數據庫信息
db.stats()數據庫刪除:刪除當前指向的數據庫,需要切換到需要刪除的目標數據庫中,如果數據庫不存在,則什么也不做
db.dropDatabase()創建集合
非固定大小的集合
db.createCollection('集合名稱')
固定大小的集合(當集合存滿時,新的數據會覆蓋之前的數據)
db.createCollection('集合名稱',{capped:true,size:指定集合的大?。▎挝皇亲止潱?max:指定集合中能存儲的最大文檔的數量})
size優先級更高查看集合
show collections刪除集合
db.集合名稱.drop()
關于增刪改查的操作
插入數據
插入單條
db.集合名稱.insert({'key':'value'})插入多條
db.集合名稱.insert(
[
{'key':'value'},
{'key':'value'},
]
)
插入數據時如果沒有指定,_id會幫您自動生成一個,也可以自己指定
這個id既是主鍵,也是一個索引
更新數據update
- 全文檔更新(由一個新的文檔替換之前的文檔,ID不變)
db.集合名稱.update(
{'key':'value'}查詢條件
{'newkey':'newvalue'}新的文檔
{
upsert:默認情況下為false,要更新的文檔不存在,不會插入一條新數據,為true則相反
multi:默認為false,只更新查找到的第一條,為true表示更新所有
}
)
局部更新
db.集合名稱.udpate(
{'key':'value'}查詢條件
{
$set:{'key':'newvalue'}
}
)save:會根據id這個字段去集合下查找,如果id存在
則進行全文檔更新,如果不存在,則插入一條新數據
db.集合名稱.save(
{id:'','key':'value'...}
)
格式化輸出
db.集合名稱.find().pretty()
刪除數據
刪除多條
db.集合名稱.remove(
{'key':'value'}條件
)刪除單條
db.集合名稱.remove(
{'key':'value'},條件
1 表示的不是數量,表示的是true
)
查詢
- db.集合名稱.find() 查詢所有
- db.集合名稱.find({'key':'value'}條件)
- db.集合名稱.findOne({'key':'value'}條件)
比較運算符
- 等于
- 小于$lt
- 小于等于$lte
- 大于$gt
- 大于或等于$gte
- 不等于$ne
db.集合名稱.find(
{time:{$gte:100}}
)
多條件查詢
db.集合名稱.find(
{
time:{$ge:100},
actors:'李連杰'
}
)
邏輯或¥$or
db.movie.find(
{
$or:
[
{ time : {$gt:100}},
{autor:'李連杰'}
],
'title':'少林寺'
}
)
范圍運算符
$in:在..范圍
使用正則查詢
db.集合名稱.find(
{
key:/^正則表達式/
}
)
db.集合名稱.find(
{
key:{$regex:'正則表達式'}
}
)
$type 只返回符合數據類型的文檔
db.集合名稱.find(
{
key:{$type:'數據類型'}
}
)
limit 限制返回
skip 跳過指定的條數
db.集合名稱.find().limit(num).skip(num)
注意:limit和skip先后順序不影響結果
sort jinxing paixu 1:升序: -1:降序
db.集合名稱.find.sort({key:方向(1 or -1),key2:方向(1 or -1)})
去重
db.集合名稱.distnict(
‘去重字段’,
{'條件'}
)
投影:project,可以選擇查詢結果中,數據的展示和隱藏
0表示隱藏,1表示顯示
db.集合名稱.find(
{'條件'}
{'key':1}
)
假如再設置要顯示的字段時,第一個字段設置為1,只展示這一個,其他的都不展示
繁殖。只隱藏當前的字段,其他的字段都會展示出來
count:統計文檔個數
db.集合名稱.count(
{'條件'}
)
db.集合名稱.find({'條件'}).count()
mongodb的聚合
- MongoDB中聚合(aggregate)主要用于處理數據(諸如統計平均值,求和等),并返回計算后的數據結果。有點類似sql語句中的 count(*)。
aggregate() 方法的基本語法格式如下所示:
db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)
管道的概念
- 管道在Unix和Linux中一般用于將當前命令的輸出結果作為下一個命令的參數。
- MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢后將結果傳遞給下一個管道處理。管道操作是可以重復的。
- 表達式:處理輸入文檔并輸出。表達式是無狀態的,只能用于計算當前聚合管道的文檔,不能處理其它的文檔。
聚合框架常用的操作
- $group:將集合中的文檔分組,可用于統計結果。
- $project:修改輸入文檔的結構。可以用來重命名、增加或
刪除域,也可以用于創建計算結果以及嵌套文檔。 - $$match:用于過濾數據,只輸出符合條件的文檔。$match使
用MongoDB的標準查詢操作。 - $limit:用來限制MongoDB聚合管道返回的文檔數。
- $skip:在聚合管道中跳過指定數量的文檔,并返回余下的文
檔。 - $unwind:將文檔中的某一個數組類型字段拆分成多條,每條
包含數組中的一個值。 - $sort:將輸入文檔排序后輸出。
聚合的表達式:
- $sum 計算總和。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}
]
)
- $avg 計算平均值
db.mycol.aggregate(
[
{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}
]
)
- $min 獲取集合中所有文檔對應值得最小值。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}
]
)
- $max 獲取集合中所有文檔對應值得最大值。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}
]
)
- $push 在結果文檔中插入值到一個數組中。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", url : {$push: "$url"}}}
]
)
- $first 根據資源文檔的排序獲取第一個文檔數據。
db.mycol.aggregate(
[
{$group : {_id : "$by_user", first_url : {$first : "$url"}}}
]
)
- $last 根據資源文檔的排序獲取最后一個文檔數據
db.mycol.aggregate(
[
{$group : {_id : "$by_user", last_url : {$last : "$url"}}}
]
)
- $$group將集合中的文檔分組,可用于統計結果,_id表示分組的依據,使用某個字段的格式為'$字段'
db.article.aggregate(
[
{$group:{_id:'$by_user',counter:{$sum:1}}}
]
)
- Group by null 將集合中所有文檔分為一組
db.article.aggregate(
[
{$group:{_id:null,counter:{$sum:1},likes:{$avg:"$likes"}}}
]
)
- $project 修改輸入文檔的結構, 可以用來重命名增加或刪除域也可以用于創建計算結果以及嵌套文檔
db.article.aggregate(
[
{$project:{by_user:1}}
]
)
db.article.aggregate(
[
{$project:{by_user:1,id:0}}
]
)
- $$match:用于過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操作
db.article.aggregate(
[
{$match:{likes:{$gt:0,$lte:20}}},
{$project:{title:1,_id:0}}
]
)
- $limit:用來限制MongoDB聚合管道返回的文檔數。從集合的起始位置查找,限制返回兩條
db.article.aggregate(
[
{$limit:2}
]
)
- $skip在聚合管道中跳過指定數量的文檔,并返回余下的文檔
db.article.aggregate(
[
{$skip:2}
]
) #在聚合管道中跳過指定數量的文檔,并返回余下的文檔。
db.article.aggregate(
[
{$match:{likes:{$gt:0,$lte:20}}},
{$skip:2},
{$project:{title:1}}
]
)
db.article.aggregate(
[
{$match:{likes:{$gt:0,$lte:20}}},
{$skip:1},
{$limit:1},
{$project:{title:1}}
]
)
- $sort:將輸入文檔排序后輸出
db.article.aggregate(
[
{$match:{likes:{$gt:0,$lte:800}}},
{$sort:{likes:-1}}
]
)
- $unwind 將文檔中的某一個數組類型字段拆分成多條,每條包含數組中的一個值。
db.article.aggregate(
[
{$unwind:'$tags'}
]
)
Mongodb管理員權限(安全方面)
超級管理員
為了更安全的訪問mongodb,需要訪問者提供用戶名和密碼,于是需要在mongodb中創建用戶
采用了角色-用戶-數據庫的安全管理方式 常用系統角色如下:
- root:只在admin數據庫中可用,超級賬號,超級權限
- Read:允許用戶讀取指定數據庫
- readWrite:允許用戶讀寫指定數據庫
創建超級管理用戶
use admin
db.createUser(
{
user:'admin',
pwd:'123',
roles:[{role:'root',db:'admin'}]
}
)
Mongodb的備份和恢復
MongoDB 備份(mongodump)
在Mongodb中我們使用mongodump命令來備份MongoDB數據。該命令可以導出所有數據到指定目錄中。
mongodump -h dbhost -d dbname -o dbdirectory
-h: MongDB所在服務器地址,例如:127.0.0.1,當然也可以指定端口號:127.0.0.1:27017
-d: 需要備份的數據庫實例,例如:test
-o: 備份的數據存放位置,例如:c:\data\dump,當然該目錄需要提前建立,在備份完成后,系統自動在dump目錄下建立一個test目錄,這個目錄里面存放該數據庫實例的備份數據。
如果沒有開啟權限
mongodump -h 127.0.0.1:27017 -d 數據庫名稱 -o ~/Desktop/數據庫備份的路徑
mongodump -h 127.0.0.1:27017 -o ~/Desktop/數據庫備份的路徑
-
如果開啟了權限設置(使用超級管理員權限)
我們也可以使用賬號密碼的方式備份指定用戶的數據庫
設置了超級管理員也可以使用如下方法備份
mongodump -u username -p password --authenticationDatabase 'admin' -d dbname -o dbpath
恢復備份
mongodb使用 mongorestore 命令來恢復備份的數據。
mongorestore -h hostname:port -d dbname --dir path
-h (host): MongoDB所在服務器地址,默認為: localhost:27017
-d (db): 需要恢復的數據庫實例,例如:test,當然這個名稱也可以和備份時候的不一樣,比如test2
--dir: 指定備份的目錄
如果沒有開啟權限
mongorestore -h 127.0.0.1:27017 -d 數據庫名稱 --dir 數據庫備份文件路徑
mongorestore -h 127.0.0.1 -dir 數據庫備份文件路徑
- 下面是我添加了管理員權限之后的備份命令
如果開啟了權限設置(使用超級管理員權限)
mongorestore -u username -p password --authenticationDatabase 'admin' -d 數據庫名稱 --dir 數據庫備份文件路徑
MongoDB數據導入與導出
導出工具:mongoexport
mongoexport -d dbname -c collectionname -o file --type json/csv -f field
參數說明:
- d :數據庫名
- c :collection名
- o :輸出的文件名
- -type : 輸出的格式,默認為json
- f :輸出的字段,如果-type為csv,則需要加上-f "字段名"
示例:
導出json
mongoexport -d class1804 -c books -o ~/桌面/dump/books.json --type json
導出csv
mongoexport -d class1804 -c books -o ~/桌面/dump/books.csv --type csv -f 'by_user,likes'
數據導入:mongoimport
mongoimport -d dbname -c collectionname --file filename --headerline --type json/csv
參數說明:
- d:數據庫名
- c:collection名
- -type:導入的格式默認json
- f:導入的字段名
- -headerline:如果導入的格式是csv,則可以使用第一行的標題作為導入的字段
- -file:要導入的文件
示例:
導入json
mongoimport -d class1712B -c books --file ~/桌面/dump/books --type json
導入csv
mongoimport -d class1712B -c info --file ~/桌面/dump/