1)mongo是一個面向文檔的數據庫,它集合了nosql和sql數據庫兩方面的特性。 2)全部實體都是在首次使用時建立。 3)沒有嚴格的事務特性,可是它保證任何一次數據變動都是原子性的。 4)也沒有固定的數據模型 5)mongo以javascript做爲命令行執行引擎,因此利用shell進行復雜的計算和查詢時會至關的慢。 6)mongo自己支持集羣和數據分片 7)mongo是c++實現的,支持windows mac linux等主流操做系統 8)性能優越,速度快
1.增刪操做 db.user.insert({name:'aaaa',age:30}); db.user.save({name:'aaaa',age:30}); db.collection.insertOne({});(3.2新特性) db.collection.deleteOne(<filter>,{});(3.2新特性) db.collection.remove({name:'aaa'}); db.collection.remove();(刪除所有) 2.更新操做 db.users.update ({ " name" : "joe" }, joe ); db.users.update ({ " name" : "joe" }, joe, true );------upsert模式 db.users.update ({ " name" : "joe" }, joe, true ,true);------MULTI模式
update是對文檔替換,而不是局部修改默認狀況update更新匹配的第一條文檔,multi模式更新全部匹配的javascript
3.查詢操做 -- 普通查詢 db.user.find(); db.user.find({name:'aaa'}); db.user.findOne({name:'aaa'}); -- 模糊查詢 db.UserInfo.find({userName :/A/}) (名稱%A%) db.UserInfo.find({userName :/^A/}) (名稱A%) 4.操做符 1.$lt, $lte,$gt, $gte(<, <=, >, >= ) 2.$all 數組中的元素是否徹底匹配 db.things.find( { a: { $all: [ 2, 3 ] } } ); 3.$exists 可選:true,false db.things.find( { a : { $exists : true } } ); 4.$mod 取模:a % 10 == 1 db.things.find( { a : { $mod : [ 10 , 1 ] } } ); 5.$ne 取反:即not equals db.things.find( { x : { $ne : 3 } } ); 6.$in 相似於SQL的IN操做 db.things.find({j:{$in: [2,4,6]}}); 7.$nin $in的反操做,即SQL的 NOT IN db.things.find({j:{$nin: [2,4,6]}}); 8.$nor $or的反操做,即不匹配(a或b) db.things.find( { name : "bob", $nor : [ { a : 1 },{ b : 2 }]}) 9.$or Or子句,注意$or不能嵌套使用 db.things.find( { name : "bob" , $or : [ { a : 1 },{ b : 2 }]}) 10.$size 匹配數組長度 db.things.find( { a : { $size: 1 } } ); 11.$type 匹配子鍵的數據類型,詳情請看 db.things.find( { a : { $type : 2 } } ); 5.數組查詢 $size 用來匹配數組長度(即最大下標) // 返回comments包含5個元素的文檔 db.posts.find({}, {comments:{‘$size’: 5}}); // 使用冗餘字段來實現 db.posts.find({}, {‘commentCount’: { ‘$gt’: 5 }}); $slice 操做符相似於子鍵篩選,只不過它篩選的是數組中的項 // 僅返回數組中的前5項 db.posts.find({}, {comments:{‘$slice’: 5}}); // 僅返回數組中的最後5項 db.posts.find({}, {comments:{‘$slice’: -5}}); // 跳過數組中的前20項,返回接下來的10項 db.posts.find({}, {comments:{‘$slice’: [20, 10]}}); // 跳過數組中的最後20項,返回接下來的10項 db.posts.find({}, {comments:{‘$slice’: [-20, 10]}}); MongoDB 容許在查詢中指定數組的下標,以實現更加精確的匹配 // 返回comments中第1項的by子鍵爲Abe的全部文檔 db.posts.find( { "comments.0.by" : "Abe" } );
1.建立索引 db.things.ensureIndex ({'j': 1}); 建立子文檔 索引 db.things.ensureIndex ({'user.Name' : - 1}); 建立 複合 索引 db.things.ensureIndex ({ 'j' : 1 , // 升序 'x' : - 1 // 降序 }); 若是 您的 find 操做只用到了一個鍵,那麼索引方向是可有可無的 當建立複合索引的時候,必定要謹慎斟酌每一個鍵的排序方向 2.修改索引 修改索引,只須要從新 運行索引 命令便可 若是索引已經存在則會 重建, 不存在的索引會被 添加 db . things . ensureIndex ({ --- 原來的索引會 重建 'user.Name ' : - 1 , --- 新增一個升序 索引 'user.Name ' : 1 , --- 爲 Age 新建降序 索引 'user.Age ' : - 1 }, 打開後臺執行 { ‘background' : true} ); 重建索引
things .reIndex();
3.刪除索引java
刪除集合中的全部 索引
. things . dropIndexes ();linux
刪除指定鍵的索引 db.things.dropIndex ({ x : 1 , y : - 1 }); 使用 command 刪除指定鍵的 索引 db.runCommand ({ dropIndexes : 'foo ' , index : { y : 1 } }); 使用 command 刪除全部 索引
. runCommand ({dropIndexes : 'foo ' ,index : '*‘})c++
若是是刪除集合中全部的文檔(remove)則不會影響索引,當有新文檔插入時,索引就會重建。
4.惟一索引算法
建立惟一索引,同時這也是一個符合惟一索引 db.things.ensureIndex ( { 'firstName ' : 1 , 'lastName ' : 1 }, { 指定爲惟一索引 'unique ' : true , 刪除重複 記錄 'dropDups ' : true });
五、強制使用索引sql
強制使用索引 a 和 b db.collection.find ({ 'a ' : 4 , 'b ' : 5 , 'c ' : 6 }). hint ({ 'a ' : 1 , 'b ' : 1 }); 強制不使用任何 索引 db.collection.find ().hint ({ '$ natural' : 1 });
索引總結:mongodb
索引能夠加速查詢; 單個索引無需在乎其索引方向; 多鍵索引須要慎重考慮每一個索引的方向; 作海量數據更新時應當先卸載全部索引,待數據更新完成後再重建索引; 不要試圖爲每一個鍵都建立索引,應考慮實際須要,並非索引越多越好; 惟一索引能夠用來消除重複記錄; 地理空間索引是沒有單位的,其內部實現是基本的勾股定理算法
安全與認證
一、 默認爲無認證,啓動用登陸 shell ;
二、 添加帳號;
三、 關閉 shell 、關閉 MongoDB ;
四、 爲 MongoDB 增長 — auth 參數;
五、 重 啓 MongoDB ;
六、 登陸 shell ,此時就須要認證了shell
冷備份
一、關閉MongoDB引擎
二、拷貝數據庫文件夾及文件
三、恢復時反向操做便可數據庫
-- 優勢:能夠徹底保證數據完整性; -- 缺點:須要數據庫引擎離線
熱備份
一、 保持MongoDB爲運行狀態
二、使用mongodump備份數據
三、使用mongorestore恢復數據windows
-- 優勢:數據庫引擎無須離線 --缺點:不能保證數據完整性,操做時會下降MongoDB性能
主從複製備份
一、建立主從複製機制
二、配置完成後數據會自動同步
三、恢復途徑不少
-- 優勢:能夠保持MongoDB處於聯機狀態,不影響性能 -- 缺點:在數據寫入密集的狀況下可能沒法保證數據完整性
修復
db.repairDatabase();
修復數據庫還能夠起到壓縮數據的做用;
修復數據庫的操做至關耗時,萬不得已請不要使用;
建議常常作數據備份;
一、主從複製 選項 說明 --only 做用是限定僅複製指定的某個數據庫 --slavedelay 爲複製設置操做延遲,單位爲秒 --fastsync 以主節點的數據快照爲基礎啓動從節點。 --autoresync 當主從節點數據不一致時,是否自動從新同步 --oplogSize 設定主節點中的oplog的容量,單位是MB 二、副本集 與普通主從複製集羣相比,具備自動檢測機制 須要使用—replSet 選項指定副本同伴 任什麼時候候,副本集當中最多隻容許有1個活躍節點 三、讀寫分離 將密集的讀取操做分流到從節點上,下降主節點的負載 默認狀況下,從節點是不容許處理 客戶端請求的,須要使用—slaveOkay打開 不適用於實時性要求很是高的應用 四、工做原理—— OPLOG oplog保存在local數據庫中,oplog就在其中的 oplog.$main集合內保存。該集合的每一個文檔都記錄了主節點上執行的一個操做,其鍵定義以下: ts:操做時間戳,佔用4字節 op:操做類型,佔用1字節 ns:操做對象的命名空間(或理解爲集合全名) o:進一步指定所執行的操做,例如插入 五、工做原理—— 同步 從節點首次啓動時,作完整同步 主節點數據發生變化時,作增量同步 從節點與主節點數據嚴重不一致時,作完整同步 六、複製管理—— 診斷 db.printReplicationInfo() 在主節點上使用 返回信息是oplog的大小以及各類操做的耗時、空間佔用等數據 在從節點上使用 db.printSlaveReplicationInfo() 返回信息是從節點的數據源列表、同步延遲時間等 七、複製管理—— 變動OPLOG 容量 在主節點上使用 設定—oplogSize參數 重啓MongoDB 八、複製管理—— 複製認證 主從節點皆須配置 存儲在local.system.users 優先嚐試repl用戶 主從節點的用戶配置必須保持一致
一、分片與自動分片
分片是指將數據拆分,分散到不一樣的實例上進行負載分流的作法。咱們常說的「分表」、「分 庫」、「分區」等概念都屬於分片的實際體現。 傳統分片作法是手工分表、分庫。自動分片技術是根據指定的「片鍵」自動拆分數據並維護數據 請求路由的過程。 遞增片鍵--連續 不均勻 寫入集中 分流較差 隨機片鍵--不連續 均勻 寫入分散 分流較好 三個組成部分 --片 保存子集數據的容器 --mongos MongoDB的路由器進程 --配置服務器 分片集羣的配置信息
二、建立分片
--啓動配置服務器 能夠建立一個或多個 --添加片 每一個片都應該是副本集 --物理服務器 性能、安全和穩定性
三、管理分片
--查詢分片 db.shards.find(); --數據庫 db.databases.find(); --塊 db.chunks.find(); --分片狀態 db.printShardingStatus(); --刪除片 db.runCommand({ 「removeshard」 : 「ip:port」 });
若是文章對你有幫助,請去個人博客留個言吧! 個人博客喜歡就收藏一下,您的支持是我最大的鼓勵!