MongoDB的學習總結
Num01-->MongoDB簡介
1、MongoDB 是一個基於分散式檔案儲存的NoSQL資料庫
2、由C++語言編寫,執行穩定,效能高
3、旨在為WEB應用提供可擴充套件的高效能資料儲存解決方案
Num02-->MongoDB特點
1、模式自由 :可以把不同結構的文件儲存在同一個資料庫裡2、面向集合的儲存:適合儲存 JSON風格檔案的形式3、完整的索引支援:對任何屬性可索引4、複製和高可用性:支援伺服器之間的資料複製,支援主-從模式及伺服器之間的相互複製。複製的主要目的是提供冗餘及自動故障轉移5、自動分片:支援雲級別的伸縮性:自動分片功能支援水平的資料庫叢集,可動態新增額外的機器6、豐富的查詢:支援豐富的查詢表達方式,查詢指令使用JSON形式的標記,可輕易查詢文件中的內嵌的物件及陣列7、快速更新:查詢最佳化器會分析查詢表示式,並生成一個高效的查詢計劃 高效的傳統儲存方式:支援二進位制資料及大型物件(如照片或圖片)
Num03-->MongoDB與SQL區別
這裡寫圖片描述
MongoDB三元素
三元素:資料庫,集合,文件1、資料庫:是一個集合的物理容器,一個資料庫中可以包含多個文件 一個伺服器通常有多個資料庫2、集合:類似於關聯式資料庫中的表。儲存多個文件,結構不固定,如可以儲存如下文件在一個集合中 {'name':'xiaoke','gender':'男'} {'name':'lili','age':18} {'book':'zhangsan,'address':'北京'} 3、文件:類似於關聯式資料庫中的行。就是一個物件,由鍵值對構成,是json的擴充套件Bson形式 {'name':'xiaoke','gender':'男'}
Num04-->MongoDB資料庫命令
1、連線成功後,預設使用test資料庫 檢視當前資料庫名稱 db 2、檢視所有資料庫名稱,列出所有在物理上存在的資料庫 show dbs 3、切換資料庫,如果資料庫不存在也並不建立,直到插入資料或建立集合時資料庫才被建立 use 資料庫名稱 4、刪除當前指向的資料庫,如果資料庫不存在,則什麼也不做 db.dropDatabase()
Num05-->MongoDB集合命令
建立語法如下:name是要建立的集合的名稱options是一個文件,用於指定集合的配置,選項引數是可選的,所以只需要到指定的集合名稱 可以不手動建立集合,向不存在的集合中第一次加入資料時,集合會被建立出來db.createCollection(name, options) 例1:不限制集合大小db.createCollection("stu") 例2:限制集合大小,後面學會插入語句後可以檢視效果 引數capped:預設值為false表示不設定上限,值為true表示設定上限 引數size:當capped值為true時,需要指定此引數,表示上限大小,當文件達到上限時,會將之前的資料覆蓋,單位為位元組db.createCollection("sub", { capped : true, size : 10 } ) 檢視當前資料庫的集合show collections刪除命令db.集合名稱.drop()
Num06-->MongoDB文件命令
Test01-->MongoDB的資料型別
Object ID:文件IDString: 字串,最常用,必須是有效的UTF-8Boolean: 儲存一個布林值,true或falseInteger: 整數可以是32位或64位,這取決於伺服器 Double: 儲存浮點值 Arrays: 陣列或列表,多個值儲存到一個鍵Object: 用於嵌入式的文件,即一個值為一個文件 Null: 儲存Null值 Timestamp:時間戳,表示從1970-1-1到現在的總秒數Date: 儲存當前日期或時間的UNIX時間格式 建立日期語句如下 注意:引數的格式為YYYY-MM-DDnew Date('2015-11-11') object id 每個文件都有一個屬性,為_id,保證每個文件的唯一性 可以自己去設定_id插入文件 如果沒有提供,那麼MongoDB為每個文件提供了一個獨特的_id,型別為objectID objectID是一個12位元組的十六進位制數: 前4個位元組為當前時間戳 接下來3個位元組為機器ID 接下來的2個位元組為MongoDB的服務程式id 最後3個位元組為簡單的增量值
Test02-->MongoDB的資料CRDU總結
1、插入語法: ------- db.集合名稱.insert(document) 插入文件時,如果不指定_id引數,MongoDB會為文件分配一個唯一的ObjectId 例1 db.stu.insert({name:'gj',gender:1}) 例2 s1={_id:'2015111',name:'hr'} s1.gender=0 db.stu.insert(s1) 2、更新語法: ------- db.集合名稱.update(, , {multi: } ) 引數query:查詢條件,類似sql語句update中where部分 引數update:更新運算子,類似sql語句update中set部分 引數multi:可選,預設是false,表示只更新找到的第一條記錄, 值為true表示把滿足條件的文件全部更新 例1:全文件更新 db.stu.update({name:'hr'},{name:'mnc'}) 例2:指定屬性更新,透過運算子$setdb.stu.insert({name:'hr',gender:0}) db.stu.update({name:'hr'},{$set:{name:'hys'}}) 例3:修改多條匹配到的資料 db.stu.update({},{$set:{gender:0}},{multi:true}) 3、儲存語法: ------- db.集合名稱.save(document) 如果文件的_id已經存在則修改,如果文件的_id不存在則新增 例1 db.stu.save({_id:'20160102','name':'yk',gender:1}) 例2 db.stu.save({_id:'20160102','name':'wyk'}) 4、刪除語法: ------- db.集合名稱.remove( , { justOne: } ) 引數query:可選,刪除的文件的條件 引數justOne:可選,如果設為true或1,則只刪除一條,預設false,表示刪除多條 例1:只刪除匹配到的第一條 db.stu.remove({gender:0},{justOne:true}) 例2:全部刪除 db.stu.remove({})
Num07-->MongoDB資料查詢
1、基本查詢: ------- 方法find():查詢 db.集合名稱.find({條件文件}) 方法findOne():查詢,只返回第一個 db.集合名稱.findOne({條件文件}) 方法pretty():將結果格式化 db.集合名稱.find({條件文件}).pretty()2、比較運算子: -------- 等於,預設是等於判斷,沒有運算子 小於$lt 小於或等於$lte 大於$gt 大於或等於$gte 不等於$ne 例1:查詢名稱等於'zhangsan'的學生 db.stu.find({name:'zhangsan'}) 例2:查詢年齡大於或等於18的學生 db.stu.find({age:{$gte:18}})3、邏輯運算子: -------- 查詢時可以有多個條件,多個條件之間需要透過邏輯運算子連線 邏輯與:預設是邏輯與的關係 例1:查詢年齡大於或等於18,並且性別為true的學生 db.stu.find({age:{$gte:18},gender:true}) 邏輯或:使用$or,值為陣列,陣列中每個元素為json 例2:查詢年齡大於18,或性別為false的學生 db.stu.find({$or:[{age:{$gt:18}},{gender:false}]})and和or一起使用 例3:查詢年齡大於18或性別為true的學生,並且學生的姓名為gj db.stu.find({$or:[{age:{$gte:18}},{gender:true}],name:'gj'})4、範圍運算子: -------- 使用"$in","$nin" 判斷是否在某個範圍內 例1:查詢年齡為18、28的學生 db.stu.find({age:{$in:[18,28]}})5、支援正規表示式: ---------- mongodb提供的終端shell,同時也是一個js的執行器,可以編寫js的程式碼和函式 使用//或$regex編寫正規表示式例1:查詢姓黃的學生 db.stu.find({name:/^黃/}) db.stu.find({name:{$regex:'^黃'}}})6、自定義查詢: -------- 使用$where後面寫一個函式(js函式),返回滿足條件的資料 例1:查詢年齡大於30的學生 db.stu.find({$where:function(){return this.age>30;}})
Num08-->MongoDB中limit與skip
limit----- 方法limit():用於讀取指定數量的文件 語法: db.集合名稱.find().limit(NUMBER) 引數NUMBER表示要獲取文件的條數 如果沒有指定引數則顯示集合中的所有文件 例1:查詢2條學生資訊 db.stu.find().limit(2) skip ---- 方法skip():用於跳過指定數量的文件 語法: db.集合名稱.find().skip(NUMBER) 引數NUMBER表示跳過的記錄條數,預設值為0 例1:查詢從第3條開始的學生資訊 db.stu.find().skip(2) 方法limit()和skip()可以一起使用,不分先後順序 ----------------------------- 建立資料集for(i=0;iNum09-->MongoDB投影
定義:在查詢到的返回結果中,只選擇必要的欄位,而不是選擇一個文件的整個欄位 如:一個文件有5個欄位,需要顯示只有3個,投影其中3個欄位即可 語法: 引數為欄位與值,值為1表示顯示,值為0不顯示 db.集合名稱.find({},{欄位名稱:1,...}) 對於需要顯示的欄位,設定為1即可,不設定即為不顯示 特殊:對於_id列預設是顯示的,如果不顯示需要明確設定為0例1db.stu.find({},{name:1,gender:1}) 例2db.stu.find({},{_id:0,name:1,gender:1})Num10-->MongoDB排序
定義:方法sort(),用於對結果集進行排序 語法 db.集合名稱.find().sort({欄位:1,...}) 引數1為升序排列 引數-1為降序排列 例1:根據性別降序,再根據年齡升序 db.stu.find().sort({gender:-1,age:1})Num11-->MongoDB統計個數
定義:方法count()用於統計結果集中文件條數 語法 db.集合名稱.find({條件}).count() 也可以與為 db.集合名稱.count({條件}) 例1:統計男生人數 db.stu.find({gender:true}).count() 例2:統計年齡大於20的男生人數 db.stu.count({age:{$gt:20},gender:true})Num12-->MongoDB消除重複
方法distinct()對資料進行去重 語法 db.集合名稱.distinct('去重欄位',{條件}) 例:查詢年齡大於18的學生,來自哪些省份 db.stu.distinct('hometown',{age:{$gt:18}})Num13-->MongoDB聚合 aggregate
定義 -- 聚合(aggregate)主要用於計算資料,類似sql中的sum()、avg() 語法: db.集合名稱.aggregate([{管道:{表示式}}]) 管道 -- 管道在Unix和Linux中一般用於將當前命令的輸出結果作為下一個命令的輸入 ps ajx | grep mongo 在mongodb中,管道具有同樣的作用,文件處理完畢後,透過管道進行下一次處理 常用管道 ----$group:將集合中的文件分組,可用於統計結果$match:過濾資料,只輸出符合條件的文件$project:修改輸入文件的結構,如重新命名、增加、刪除欄位、建立計算結果$sort:將輸入文件排序後輸出$limit:限制聚合管道返回的文件數$skip:跳過指定數量的文件,並返回餘下的文件$unwind:將陣列型別的欄位進行拆分 表示式 --- 處理輸入文件並輸出 語法 表示式:'$列名'常用表示式$sum: 計算總和,$sum:1同count表示計數$avg: 計算平均值$min: 獲取最小值$max: 獲取最大值$push: 在結果文件中插入值到一個陣列中$first: 根據資源文件的排序獲取第一個文件資料$last: 根據資源文件的排序獲取最後一個文件資料Test-->unwind的深入理解
將文件中的某一個陣列型別欄位拆分成多條,每條包含陣列中的一個值 語法1--- 對某欄位值進行拆分 db.集合名稱.aggregate([{$unwind:'$欄位名稱'}]) 構造資料 db.t2.insert({_id:1,item:'t-shirt',size:['S','M','L']}) 查詢 db.t2.aggregate([{$unwind:'$size'}]) 語法2--- 對某欄位值進行拆分 處理空陣列、非陣列、無欄位、null情況 屬性preserveNullAndEmptyArrays值為false表示丟棄屬性值為空的文件 屬性preserveNullAndEmptyArrays值為true表示保留屬性值為空的文件 db.inventory.aggregate([{ $unwind:{ path:'$欄位名稱', preserveNullAndEmptyArrays:#防止資料丟失 } }]) 構造資料 db.t3.insert([ { "_id" : 1, "item" : "a", "size": [ "S", "M", "L"] }, { "_id" : 2, "item" : "b", "size" : [ ] }, { "_id" : 3, "item" : "c", "size": "M" }, { "_id" : 4, "item" : "d" }, { "_id" : 5, "item" : "e", "size" : null } ]) 使用語法1查詢 db.t3.aggregate([{$unwind:'$size'}]) 檢視查詢結果,發現對於空陣列、無欄位、null的文件,都被丟棄了 問:如何能不丟棄呢? 答:使用語法2查詢 db.t3.aggregate([{$unwind:{path:'$size',preserveNullAndEmptyArrays:true}}]) Num14-->MongoDB索引
在mysql中已經學習了索引,並知道索引對於查詢速度的提升 mongodb也支援索引,以提升查詢速度 步驟一:建立大量資料 在命令列中執行如下程式碼,向集合中插入10萬條文件 注意:不要在圖形介面中執行,因為軟體原因無法插入10萬條資料就會中斷執行for(i=0;i這裡寫圖片描述
步驟三:建立索引 建立索引 1表示升序,-1表示降序 db.集合.ensureIndex({屬性:1}) 如 db.t1.ensureIndex({name:1}) 步驟四:對索引屬性查詢 執行上面的同樣的查詢,並進行查詢效能分析 db.t1.find({name:'test10000'}).explain('executionStats') 效能分析結果如下圖 索引後:這裡寫圖片描述
索引的命令 建立唯一索引,實現唯一約束的功能 db.t1.ensureIndex({"name":1},{"unique":true}) 聯合索引,對多個屬性建立一個索引,按照find()出現的順序 db.t1.ensureIndex({name:1,age:1}) 檢視文件所有索引 db.t1.getIndexes() 刪除索引 db.t1.dropIndex('索引名稱')Num15-->MongoDB 備份與恢復
備份 -- 語法: mongodump -h dbhost -d dbname -o dbdirectory -h:伺服器地址,也可以指定埠號 -d:需要備份的資料庫名稱 -o:備份的資料存放位置,此目錄中存放著備份出來的資料 例1sudo mkdir test1bak sudo mongodump -h 192.168.196.128:27017 -d test1 -o ~/Desktop/test1bak 恢復: -- 語法: mongorestore -h dbhost -d dbname --dir dbdirectory -h:伺服器地址 -d:需要恢復的資料庫例項 --dir:備份資料所在位置 例1mongorestore -h 192.168.196.128:27017 -d test2 --dir ~/Desktop/test1bak/test1
作者:曉可加油
連結:
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/964/viewspace-2804439/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Java專案中MongoDb學習和使用總結JavaMongoDB
- docker的學習總結Docker
- 學習總結
- MongoDB基礎總結MongoDB
- MongoDB查詢總結MongoDB
- MYSQL學習總結MySql
- 近期學習總結
- KUDU學習總結
- CompletableFuture學習總結
- SpringCloud 學習總結SpringGCCloud
- awk 學習總結
- MyBatis 學習總結MyBatis
- Maven學習總結Maven
- Ajax學習總結
- JVM學習總結JVM
- mysqlimport學習總結MySqlImport
- WorkFlow學習總結
- JNI 學習總結
- SVG學習總結SVG
- 【TS】學習總結
- Kafka 總結學習Kafka
- Typescript學習總結TypeScript
- python學習總結Python
- Oracle學習總結Oracle
- redis學習總結Redis
- ConstraintLayout 學習總結AI
- BOM學習總結
- tkinter學習總結
- vue學習總結Vue
- HSF學習總結
- HTML學習總結HTML
- Mybatis學習總結MyBatis
- JavaWeb學習總結JavaWeb
- ElasticSearch 學習總結Elasticsearch
- Storm學習總結ORM
- vue 學習總結Vue
- lua 學習總結
- Angularjs 學習總結AngularJS