mongoDB基礎
一捡多、MongoDB簡介
MongoDB 是一個基于分布式文件存儲的數(shù)據(jù)庫休玩,提供高性能、高可用性和自動擴展的功能馋艺。MongoDB 是用C++語言編寫的非關系型數(shù)據(jù)庫嚎卫。使用高效的二進制數(shù)據(jù)存儲嘉栓,文件存儲格式為BSON (一種JSON 的擴展)等。MongoDB 支持各種編程語言拓诸,包括Python侵佃、Java、C++恰响、GO趣钱、PHP等。
1.1 MongoDB特性
- 面向集合存儲:數(shù)據(jù)被分組到若干集合胚宦,每個集合可以包含無限個文檔首有,可以將集合想象成RDBMS的表燕垃,區(qū)別是集合不需要進行模式定義。
- 模式自由:集合中沒有行和列的概念井联,每個文檔可以有不同的key卜壕,key的值不要求一致的數(shù)據(jù)類型。
- 支持動態(tài)查詢:mongoDB支持豐富的查詢表達式烙常,查詢指令使用json形式表達式轴捎。
- 完整的索引支持:mongoDB的查詢優(yōu)化器會分析查詢表達式,并生成一個高效的查詢計劃蚕脏。
- 高效的數(shù)據(jù)存儲:支持二進制數(shù)據(jù)及大型對象(圖片侦副、視頻等)。
- 支持復制和故障恢復
- 自動分片以支持云級別的伸縮性驼鞭,支持水平的數(shù)據(jù)庫集群秦驯,可動態(tài)添加額外的服務器
1.2 mongo vs mysql
k-v --> document --> collection --> database)
cloumn --> row --> table --> database
一條document記錄: {"country" : "China", "city": "BeiJing"}
1.創(chuàng)建數(shù)據(jù)庫 >> use database_name; //有則切換,無則創(chuàng)建
2.刪除數(shù)據(jù)庫 >> db.dropDatabase();
3.展示所有數(shù)據(jù)庫>> show dbs;
二挣棕、基本功能
2.1译隘、查詢
- db.collection.find(document) 查詢數(shù)據(jù)【加pretty()方法后會自動格式化】
- db.collection.findOne(document) 只返回第一個
- 條件操作符
等于 db.collection.find({"name":"Lukes"}).pretty() where name= 'Lukes'
$lt 小于 db.collection.find({"likes":{$lt:50}}).pretty() where likes < 50
$lte 小于或等于 db.collection.find({"likes":{$lte:50}}).pretty() where likes <= 50
$gt 大于 db.collection.find({"likes":{$gt:50}}).pretty() where likes > 50
$gte 大于或等于 db.collection.find({"likes":{$gte:50}}).pretty() where likes >= 50
$ne 不等于 db.collection.find({"likes":{$ne:50}}).pretty() where likes != 50
$in 在多個值范圍內(nèi)
$nin 不在多個值范圍內(nèi)
$all 匹配數(shù)組中多個值
$regex 正則,用于模糊查詢
$size 匹配數(shù)組大小
$mod 取模運算
$exists 字段是否存在
$slice 查詢字段集合中的元素(比如從第幾個之后洛心,第N到第M個元素)
and條件 db.col.find({key1:value1, key2:value2}).pretty()固耘;
or:[{key1:value1}, {key2:value2}]}).pretty();//pretty指會將顯示的結果優(yōu)化
分頁 db.collection_name.find().limit(number).skip(number); //limit指取幾條數(shù)據(jù)词身,skip指第幾頁
排序 db.collection_name.find().sort({key:1}); //1指順序厅目,-1指倒序
2.2、增刪改
- db.collection.insertOne(document) 單個文檔插入到集合中
- db.collection.insertMany(document) 多個文檔插入到集合中
- db.collection.insert(document) 單個或者多個文件插入到集合中
- db.collection.updateOne(document) 更新單條
- db.collection.updateMany(document) 更新多條
- db.collection.deleteOnedocument() 刪除單條文檔
- db.collection.deleteMany(document) 刪除多條文檔
- db.collection.save(document);
- db.collection.remove(query,{ justOne:boolean, writeConcern:document })
其中: query:(可選)刪除的文檔的條件偿枕。
justOne: (可選)如果設為 true 或1璧瞬,則只刪除一個文檔户辫。
writeConcern:(可選)拋出異常的級別渐夸。
注:如果是直接調(diào)用db.collection.remove() //則刪除所有數(shù)據(jù)
2.3、聚合查詢:類似MySQL中的count渔欢、sum墓塌、group by
三種聚合查詢方法:聚合管道、map-reduce 和單一目標聚合方法奥额。
聚合管道方法:MongoDB 的聚合框架就是將文檔輸入處理管道苫幢,在管道內(nèi)完成對文檔的操作,最終將文檔轉換為聚合結果垫挨。最基本的管道階段提供過濾器韩肝,其操作類似查詢和文檔轉換,可以修改輸出文檔的形式九榔。其他管道操作提供了按特定字段對文檔進行分組和排序的工具哀峻,以及用于聚合數(shù)組內(nèi)容(包括文檔數(shù)組)的工具涡相。此外,在管道階段還可以使用運算符來執(zhí)行諸如計算平均值或連接字符串之類的任務剩蟀。聚合管道可以在分片集合上運行催蝗。聚合管道方法的流程參見下圖。
MongoDB 中的聚合操作語法
Query 設置統(tǒng)計查詢條件育特,類似于 SQL 的 where丙号,
field1 為分類字段,要求使用 _id 名表示分類字段缰冤,
field2 為包含各種統(tǒng)計操作符的數(shù)字型字段犬缨,如
avg棉浸、$min 等遍尺。
聚合內(nèi)置了很多函數(shù)
- $project:修改輸入文檔的結構′剔郑可以用來重命名乾戏、增加或刪除域,也可以用于創(chuàng)建計算結果以及嵌套文檔三热。
-
match使用MongoDB的標準查詢操作就漾。
- $limit:用來限制MongoDB聚合管道返回的文檔數(shù)呐能。
- $skip:在聚合管道中跳過指定數(shù)量的文檔,并返回余下的文檔抑堡。
- $group:將集合中的文檔分組摆出,可用于統(tǒng)計結果。
- $sort:將輸入文檔排序后輸出首妖。
- $geoNear:輸出接近某一地理位置的有序文檔偎漫。
- $unwind:將文檔中的某一個數(shù)組類型字段拆分成多條,每條包含數(shù)組中的一個值有缆。
實例一
db.getCollection('A_collection').aggregate({
$addFields:{
"name":{
$cond:[{$ne:["$alias", undefined]},"$alias","$host_name"]
}
},
{
$project:{
"name":1
}
}
}) //collection的alias字段是否存在,如果存在,就取alias,否則取host_name字段
實例二
{ "_id" : 1, "item" : "abc1", qty: 300 }
{ "_id" : 2, "item" : "abc2", qty: 200 }
{ "_id" : 3, "item" : "xyz1", qty: 250 }
//根據(jù)qty的值來生成新的數(shù)據(jù)(值)
db.inventory.aggregate([
{$project:
{ item: 1,
discount: {$cond: { if: { $gte: [ "$qty", 250 ] }, then: 30, else: 20 }}
}
}])
//output discount是新的鍵,它根據(jù)cond的if判斷后,分別被賦上了相應的值
{ "_id" : 1, "item" : "abc1", "discount" : 30 }
{ "_id" : 2, "item" : "abc2", "discount" : 20 }
{ "_id" : 3, "item" : "xyz1", "discount" : 30 }
三象踊、mongo用戶
1、mongo授權啟動
- 數(shù)據(jù)庫用戶角色:read棚壁、readWrite;
- 數(shù)據(jù)庫管理角色:dbAdmin杯矩、dbOwner、userAdmin袖外; (擁有創(chuàng)建數(shù)據(jù)庫, 和創(chuàng)建用戶的權力)
- 集群管理角色:clusterAdmin史隆、clusterManager、clusterMonitor曼验、hostManager泌射;(管理員組, 針對整個系統(tǒng)進行管理)
- 備份恢復角色:backup头镊、restore;
- 所有數(shù)據(jù)庫角色:readAnyDatabase魄幕、readWriteAnyDatabase相艇、userAdminAnyDatabase、dbAdminAnyDatabase
- 超級用戶角色:root //這里還有幾個角色間接或直接提供了系統(tǒng)超級用戶的訪問(dbOwner 纯陨、userAdmin坛芽、userAdminAnyDatabase)
- 內(nèi)部角色:__system
- 無權限啟動 >> mongod -f ***.conf
- 授權啟動 >> mongod -f ***.conf -auth
- 以授權模式啟動后,連接mongo時翼抠,需要帶上用戶名和密碼
2咙轩、創(chuàng)建用戶
db.createUser({
user:<name_string>, # 字符串 用戶名
pwd:<password_string>, # 字符串 密碼
roles:[{role:<role_name>,db:<db_name>}] # 數(shù)組+對象 指定用戶的角色
}
)
3、刪除用戶
db.dropUser(<user_name>) 刪除某個用戶阴颖,接受字符串參數(shù)
db.dropAllUser() 刪除當前庫的所有用戶
四活喊、BSON
MongoDB中的JSON文檔存儲在名為BSON(二進制編碼的JSON)的二進制表示中。
與其他將JSON數(shù)據(jù)存儲為簡單字符串和數(shù)字的數(shù)據(jù)庫不同量愧,BSON編碼擴展了JSON表示钾菊,
使其包含額外的類型,如int偎肃、long煞烫、date、浮點數(shù)和decimal128累颂。這使得應用程序更容易可靠地處理滞详、排序和比較數(shù)據(jù)。
連接MongoDB的Go驅動程序中有兩大類型表示BSON數(shù)據(jù):D和Raw紊馏。
類型D家族被用來簡潔地構建使用本地Go類型的BSON對象料饥。這對于構造傳遞給MongoDB的命令特別有用。D家族包括四類:
- D:一個BSON文檔朱监。這種類型應該在順序重要的情況下使用岸啡,比如MongoDB命令。
- M:一張無序的map赌朋。它和D是一樣的凰狞,只是它不保持順序篇裁。
- A:一個BSON數(shù)組沛慢。
- E:D里面的一個元素。
GridFS
- GridFS是MongoDB的一個子模塊达布,主要用于在MongoDB中存儲文件团甲,相當于MongoDB內(nèi)置的一個分布式文件系統(tǒng)。
- 本質(zhì)上還是講文件的數(shù)據(jù)分塊存儲在集合中黍聂,默認的文件集合分為fs.files和fs.chunks躺苦。
- fs.files是存儲文件的基本信息身腻,比如文件名,大小匹厘,上傳時間嘀趟,md5等。
- fs.chunks是存儲文件真正數(shù)據(jù)的地方愈诚,一個文件會被分割成多個chunk塊進行存儲她按,一般為256k/個。
如果你的項目中用到了MongoDB炕柔,那么你可以使用GridFS來構建一個文件系統(tǒng)酌泰,這樣就不用去購買第三方的存儲服務了。
GridFS的好處是你不用單獨去搭建一個文件系統(tǒng)匕累,直接使用Mongodb自帶的即可陵刹,備份,分片都依賴MongoDB欢嘿,維護起來也方便衰琐。