標籤:mongodb常用命令及例子詳細介紹三
常用命令,及其進階命令使用介紹
一:增刪改查的進階應用程式詳細介紹:增:***插入的時候c1不在的話將自動建立***不管插入那條記錄都會自動給帶個值id 自增主鍵唯一insert 和 save(當id衝突是則修改,否則插入)一:id主鍵不衝突的情況沒區別db.c1.insert({name:"leyangjun"});db.c1.insert({name:"leyangjun"}); insert插入的值id都是唯一的,不會主鍵id衝突db.c1.save({name:"leyangjun"}); 和insert一樣沒區別插入記錄的id都是唯一主鍵二:id主鍵衝突的情況(衝突則更新)db.c1.insert({_id:1,name:"leyangjun2"});db.c1.insert({_id:1,name:"leyangjun2"}); 在插入同樣的值就會報錯db.c1.save({_id:1,name:"leyangjun3"}); --就插入成功,id衝突則更新,把idname=leyangjun2 改成leyangjun3還可以這麼插入(很靈活):*最好別這麼玩,這麼的後果就是你在php程式裡面用時取值就麻煩啦db.c1.insert({name:"user1",post:{tit:1,cnt:1111}}); --值是子JSONdb.c1.insert({name:"user1",post:[1,2,3,4,5,6]}); --值是數組既能是js的json還可以迴圈插入10條:for(i=1; i<=10; i++){db.c1.insert({name:"user"+i});}刪:db.c1.remove(); 全部刪除 ==({})空JSON,是json的就全刪除db.c1.remove({name:"user1"}); --指定刪除查:db.c1.find(); ==({})查詢所有db.c1.find({name:"user3"}); 條件查詢情境:記錄中有多列只要指定的列(但是_id會預設帶上),要的為1,不要為0db.c1.insert({name:"leyangjun",age:23,sex:"nan"});db.c1.find({name:"leyangjun"},name:1); 只取這條記錄name這列db.c1.find({name:"leyangjun"},name:1,age:1); 取name,age這個2列db.c1.find({name:"leyangjun"},name:1,_id:0); 不要預設的_id列條件運算式查詢:1): <,<=,>,>= --$gt大於、$lt小於 、$gte大於等於、$lte小於等於插入10做測試for(i=1; i<=10; i++){db.c1.insert({name:"user"+i,age:1})}db.c1.find({age:$gt:5}); 年齡大於5的 $gt大於db.c1.find({age:$lt:5}); 年齡小於5的 $lt小於db.c1.find({age:$gte:5}); 年齡大於等於5的 $gte大於等於db.c1.find({age:$lte:5}); 年齡小於等於5的 $lte小於等於db.c1.find({age:5}); 年齡等於5的db.c1.find({age:$ne:5}); 年齡不等於5的統計裡面有多少條記錄:db.c1.count(); 或者 db.c1.find().count();排序:db.c1.find().sort({age:1}) --- 1表示升序db.c1.find().sort({age:-1}) --- -1是降序limit和 結合 skip分頁:db.c1.find().limit(3); ---從0開始拿3條記錄db.c1.find().skip(1).limit(5); ---跳過一個拿出5條(也就是從第幾個開始拿幾個) 2,3,4,5,6db.c1.find().sort({age:-1}).skip(1).limit(5).count(0); ---count統計預設是0,不會看前面寫的條件,有幾條就統計幾條db.c1.find().sort({age:-1}).skip(1).limit(5).count(1); ---按照前面的條件在統計記錄數2):$all,查出包含某個值 --主要針對數組來用db.c1.insert({name:"user"},post:[1,2,3,4,5,6]);db.c1.find({post:{$all:[1,2,3]}}); --找出post中包含1,2,3的,其中有值為假就查不出來3):$exists 操作檢查一個欄位是否存在db.c1.find({age:{$exists:1}}); ---查看是否包含欄位age4):$mod 取餘db.c1.find({age:{$mod:[2,1]}}); ---取對2 餘1的 1,3,5,7,9.....db.c1.find({age:{$mod:[2,0]}}); ---取對2 餘0的 2,4,6,8,10.....5):$ne 不等於db.c1.find({age:$ne:5}); 年齡不等於5的6):$in 和 $nin 類似於傳統關係型資料庫中的in , not indb.c1.find({age:{$in:[1,3,5]}}); ---age等於1,3,5的值(是不是數組是操作符)b.c1.find({age:{$nin:[1,3,5]}}); ---age不等於1,3,5的*規律:查詢的時候一般出現的[1,3,5]是操作符不是數組7):$or 、$nor(二者是相反的)db.c1.find({$or:[{name:"user2"},{name:"user3"}]}); --找出name=user2 或者 name=user3的記錄db.c1.find({$nor:[{name:"user2"},{name:"user3"}]}); --過濾掉name=user2和user3的記錄db.c1.find({$or:[{name:"user2"},{age:8},{age:10}]}); --找出name=user2 或 age=8 或 age=10的記錄db.c1.find({$nor:[{name:"user2"},{age:8},{age:10}]}); ----找出name!=user2 或 age!=8 或 age!=10的記錄8):$size 找出欄位數組值的個數->專門正對數組的操作db.c1.insert({name:"user1",post:[1,2,3,4,5,6]}); 第一條記錄db.c1.insert({name:"user1",post:[7,8,9]}); 第二條記錄 db.c1.find({post:$size:3}); --就會找到第二條記錄,post裡面的的個數是39)****Regex*******和js正則一樣:db.c1.find({name:/user/i}); ---找出name值包含user的10):DISTINCT 類似關聯式資料庫中的distinctdb.c1.insert({name:"leyangjun"});db.c1.insert({name:"leyangjun"});db.c1.distinct("name"); ---name值去重,查出一條記錄11):$elemMatch元素匹配db.c3.insert({name:"user1",post:[{tit:1},{tit:2},{tit:3}]});db.c3.insert({name:"user2",post:[{tit:"aaa"},{tit:"bbb"},{tit:"ccc"}]});尋找tit=2的記錄db.c3.find({"post.tit":2}); --可以找到db.c3.find({post:{$elemMatch:tit:2}}); --這種方式匹配db.c3.find({post:{$elemMatch:tit:2,tit:3}}); --匹配tit=2 tit=3的記錄12):遊標的概念(用的很少)var x=db.c1.find();x.hasNext(); --有沒有值,返回的是true 和 false,true的話就去連結資料庫拿值,否則連結資料庫x.next() --取出來一條值x.next()x.next()x.next() ---有值就一直往下取x.hasNext(); ---為FALSE也就沒值啦13):null查詢(沒有值,值為空白,值為NULL的)匹配age=null的db.c4.find({age:null}); ---這個匹配是不準的,記錄中沒有age欄位的也會被查出來db.c4.find({age:{$exists:1,$in:[null]}}); --先判斷過濾age是否存在,在匹配age=null的或db.c4.find({age:$type:10}); ---10就是null 推薦使用這種查nulldb.c4.find({age:$type:10,name:"user1"}); --age=null 並且 name=user114):$slice->只針對數組db.c3.insert({name:"user1",post:[{tit:1},{tit:2},{tit:3}]});db.c3.find({name:"user1",{post:$slice:2}}); ---取name=user1,前2條貼,就是post欄位的值 對應數組的:1,2db.c3.find({name:"user1",{post:$slice:-2}}); ---取name=user1,後2條貼,就是post欄位的值 對應數組的:2,3db.c3.find({name:"user1",{post:$slice:[1,2]}}), --- 從第1條開始取2條貼 對應數組的:2,3改:update文法介紹 預設是0,0--後面2個參數值db.collection.update(criteria,objNew,upsert,multi); 參數說明: criteria:用於設定查詢條件的對象 objnew:用於設定更新的內容對象 upsert:如果記錄已經存在,更新它,否則新增一個記錄 multi:如果有多個合格記錄,全部更新 注意:預設情況,只會更行第一個合格記錄哦例子:db.c1.insert({name:"leyangjun",age:23);db.c1.update({name:"leyangjun"},{sex:"nan"}); --這樣會吧name,age刪掉,記錄只會留下sex欄位值db.c1.update({name:"user6"},{name:"user66"},1); --1表示,user6存在則改成user66,否則user6不存在則增加新的記錄name=user66第4個參數只能配合魔術變數使用$set,批次更新db.c1.update({name:"user6"},{$set:{name:"user66"}},0,1); --將所有的name=user6的全部更新user662):$set 增加欄位,或批量修改欄位值(存在則更新,不存在則增加)db.c1.update({name:"user6"},{$set:{name:"user66"}},0,1); --批量修改name值db.c1.update({name:"user10"},{$set:{age:10}},0,1); --將name=user1的全部加上 age欄位,且值=103):$inc -->increment自增的意思,如果欄位有則加減(自己定),沒有則新增情境:現在在大促了,想給沒給會員贈送5個積分,但是:積分欄位有的會員沒有有的有的情況 現在想沒有積分欄位的會員也得加5分,$inc就能做到db.c1.insert({name:"leyangjun",age:23,score:11});db.c1.insert({name:"leyangjun",age:23,score:1});db.c1.insert({name:"leyangjun",age:23});--加積分db.c1.update({},{$inc:score:10},0,1); --{}表示所有使用者,都加10個積分,沒有score欄位的,$inc會統一加上db.c1.update({name:"user1"},{$inc:score:10}); 加減都行db.c1.update({name:"user1"},{$inc:score:-10});*set 和 $inc 都可以增加欄位,但是$inc增加必須是整型4):$unset 刪除欄位(內建的_id欄位是刪不鳥的)db.c5.update({},{$unset:{score:1},0,1); --1表示true,將所有記錄中的score欄位刪掉db.c5.update({},{$unset:{score:1,age:1},0,1); --刪除多個5):$push 針對數組增加元素(更新的魔術方法一般在欄位的外側,查詢是在內側)db.c3.insert({name:"user1",arr:[1,2,3]});db.c3.update({name:"user1"},{$push:{arr:4}}); --name=user1的arr增加元素,記住不能同時插入多個(可以壓數組,就是不能同時壓入多個值)6):$pop 將欄位裡的最後元素移除,針對數組db.c3.update({name:"user1"},{$pop:{arr:1}}); --1表示最後一個,將arr裡面的最後元素移除db.c3.update({name:"user1"},{$pop:{arr:-1}}); -- -1表示刪除第一個值7):$pushAll壓入多個值db.c3.update({name:"user1"},{$push:{arr:[4,5,6]}}); ---壓入多個值8):$addToSet 壓入值是會去重複插入(如值裡面有4,在這麼插入裡面只會有一個4)db.c3.update({name:"user1"},{$addToSet:{arr:4}}); --如果值裡面有4,是插入不進去的,沒有重複的則插入$addToSet 和 $each 配合使用插入多個:db.c3.update({name:"user1"},{$addToSet:{arr:{$each:[7,8,9]}}}); --插多個9):$pull 刪除數組裡面的某個值,針對數組db.c3.update({name:"user1"},{$pull:{arr:5}}); --刪除數組中為5的值10):$pullAll一次性刪除多個db.c3.update({name:"user1"},{$pullAll:{arr:[2,4]}}); --刪除值為2,411):$rename修改欄位名db.c3.update({name:"user1"},{$rename:{arr:"post"}}); 或 db.c3.update({name:"user1"},{$rename:{"arr":"post"}}); 12):特殊的操作符號 $db.c3.insert({name:"user1",arr:[{tit:"php"},{tit:"java"},{tit:"linux"}]});把標題為linux的值改下:db.c3.update({"arr.tit":"linux"},{$set:{"arr.$.cnt":"linux is very good"}});*小結:情境1:db.c1.insert({name:"leyangjun",age:23});var x=find({name:"user1"});x --斷行符號有值x --在斷行符號沒值了,所以find本身是帶有遊標的情境2:var x=findOne({name:"user1"});x --斷行符號有資料 x是一個json,在mogodb用戶端的時候輸出你就能看看出來x --斷行符號還有資料x.sex="nan" --可以加欄位,但是這加的欄位是不會直接加到資料記錄x.sex="score" ...... 把x加欄位,直接儲存到資料庫db.c1.save(x); --資料就加到裡面去啦,db.c1.insert({name:"leyangjun",age:23}); ---增db.c1.remove(); ---刪(刪除所有)db.c1.remove({"name":"leyangjun"}); --刪除名字等於leyangjun的記錄db.c1.update({name:"leyangjun"},{name:"lekey"}); ---改,(如果還有age值的話,會被刪除,只留下name值)db.c1.update({name:"leyangjun"},{$set:{name:"lekey"}}); --改,這個改會保留原有的值db.c1.update({name:"lekey"},{$set:{sex:"nan"}}); --還可增加值,名字等於lekey記錄增加欄位值sexdb.c1.find(); ---查db.c1.find({"name":"leyangjun"});***普通集合 和 固定集合 的區別*****普通集合:普通集合的空間是隨著你的json對象的值增多而自動增大固定集合:在32位機上一個append collection的最大值約483.5M,64位上只受系統大小的限制。二:capped collection(固定集合)小命令記住鳥:show dbs; --顯示所有資料庫db --顯示當前資料庫show tables; -- 顯示當前庫下的所有集合(也就是顯示所有表)db.c5.drop(); --刪除c5集合db.dropDatabase();注意哈:mongodb當你插入和進入的時候會預設的給你建立資料庫和集合(表)db.createCollection("c1"); --手動建立c1集合(表)db.c1.find();db.c1.drop();簡單介紹:capped collections是效能出色的有著固定大小的集合,以LRU(least recently used最近最少使用) 規則和插入順序進行age-out(老化移出)處理,自動維護集合中對象的插入順序,在建立時要預先執行大小 。如果空間用完,新添加的對象將會取代集合中最舊的對象。 永遠保持最新的資料 功能特點:可以插入及更新,但更新不能超出collection的大小,否則更新失敗。不允許刪除,但是可以調用drop()刪除集合中的所有行,但是drop後需要顯示地重建集合。在32位機上一個append collection的最大值約483.5M,64位上只受系統大小的限制(就是系統對檔案大小的限制)。 屬性及方法: 優點屬性1:對固定集合進行插入速度極快屬性2:按照插入順序的查詢輸出速度極快屬性3:能夠在插入最新資料時,淘汰最早的資料用法1:儲存日誌資訊用法2:緩衝一些少量的文檔建立固定集合:createCollection命令來建立--size是大小設定的是10M,如果你的檔案超了10M之前的檔案就會被自動刪除(刪除的規則是老的資料會被刪除一次類推)db.createCollection("my_collection",{cappend:true,size:10000000,max:5}); 建立一個集合為:‘my_collection’的固定集合,大小為10000000位元組。還可以限定文檔個數。加上max:100屬性。注意:指定文檔上限,必須指定大小。文檔限制是在容量沒滿是進行淘汰,要是滿了,就根據容量限制來進行淘汰。 當你建立集合後會自動給你建立對應的indexSize{"_id_":xxxx}索引id,能後 db.system.indexs.find(); --這個裡面就會自動為你剛才建立的集合形成主鍵索引 建立對應的ID在這裡db.c1.stats(); --查看集合C1的狀態值,大小啊什麼的,索引id什麼的 注意有個屬性:capped為1 說明是固定集合普通集合轉固定集合:runCommand命令db.runCommand({converToCapped:"c2",size:10000000,max:3});三:GridFS(大檔案上傳和下載,專門用來儲存圖片和視頻)介紹:GridFS是一種在mongodb中儲存大二進位檔案的機制,使用GridFS的原因以下幾種: ->儲存巨大的檔案,比如視頻、高清圖片 ->利用GridFS可以簡化需求 ->GridFS會直接利用已經建立的複製或分區機制,故障恢複和擴充都很容易 ->GridFS可以避免使用者上傳內容的檔案導致系統出現問題 ->GridFS不產生磁碟片段GridFS使用兩個表來儲存資料:files 包含中繼資料對象chunks 包含其他一些相關資訊的二進位塊* 為了使多個GridFS命名為一個單一的資料庫,檔案和塊都有一個首碼,預設情況下,首碼是fs, 所以任何預設的GridFS儲存將包含fs.files和fs.chunks。 各種第三房語言可以更改其首碼。 使用GridFS mongofiles(存檔案的地方)mongofiles 是從命理行操作GridFS的一種工具三個命令:put(儲存) get(擷取,下載) list(列表)例子:./mongofiles -h --查看支援的基本參數./mongofiles list --查看mongofiles 的所有檔案現在類比一個檔案丟到裡面去tar czf mongosniff.tar.gz mongosniff --把mongosniff檔案壓縮成包./mongofiles put mongosniff.tar.gz --把包檔案上傳上去 能後你在進入mongo./mongoshow tables; --你會發現多了2個集合 fs.files 、fs.chunksdb.fs.files.find(); --查看--出現對應的欄位說明:filename:儲存的檔案名稱chunkSize: chunks分塊的大小uplodaDate:入庫時間md5:此檔案的md5碼length:檔案大小,單位”位元組“fs.files中儲存的是一些基礎的中繼資料資訊,真正的內容在fs.chunks裡面db.fs.chunks.find(); --真正的檔案是在這裡面的哦exit;./mongofiles list --就可以查看到我們穿上來的檔案包./mongofiles get mongosniff.tar.gz --下載這個檔案,下載到你當前執行命令的目錄下./mongofiles delete mongosniff.tar.gz --刪除該檔案 *注意:當你刪除mongofiles下的檔案時候,fs.files 、fs.chunks表下也就沒東西四:效能一:索引管理mongodb提供了多樣性的索引支援,索引資訊被儲存在system.indexs中,mongodb中的_id欄位在 建立的時候,預設已經建立了索引,這個索引比較特殊,並且不可刪除,不過capped collection列外。 1:建立索引 一:普通索引for(i=1;i<=10;i++){db.c1.insert({name:"user"+i,age:i});}db.c1.find({name:"user5"}).explain(); --explain和MySQL一樣解析一條語句,沒索引就全表掃描這個可以看出來1是升序(預設) -1是降序db.c1.ensureIndex({name:1});db.c1.ensureIndex({name:1},{background:true}); --如果資料較大耗時,放到後台執行,加上第二個參數即可,表示放到後台執行db.c1.getIndexKeys(); --查看所有欄位 簡單資訊db.c1.getIndexes() --查看錶索引 詳細資料db.c1.find({name:"user5"}).explain(); --建立完索引後,你會發現只會掃描一行,不會全表掃描 二:唯一索引db.c1.ensureIndex({age:1},unique:1); --age欄位建立唯一索引db.c1.insert({name:"user11",age:10}); --你會發現插不進去,以為age是唯一索引 2:查看索引db.c1.getIndexKeys(); --查看所有欄位 簡單資訊db.c1.getIndexes() --查看錶索引 詳細資料 3:刪除索引db.c1.dropIndexes(); --刪除所有索引 _id刪不掉哦db.c1.dropIndex({name:1}); --指定刪除name索引二:效能最佳化explain執行計畫(看影響行數)mongodb提供了一個explain命令讓我們獲知系統如何處理查詢請求,利用explain命令我們可以很好的觀察系統如何使用索引來加快檢索,同時可以針對性最佳化索引。最佳化器profile(類似MySQL的慢查詢日誌)預設是關閉的,且預設是100毫秒db.getProfilingLevel(); --0 如果是0,說明沒有開啟慢查詢日誌db.setProfilingLevel(1); --1 表示開啟記錄慢查詢(預設為100ms) --2 表示記錄所有命令db.setProfilingLevel(1,1000); --第一種方式:第二個參數是設定時間毫秒為單位 --第二種方式:啟動mongodb時帶上 --slowms 設定mongodb最佳化方案:1:建立索引2:限定返回結果條數3:查詢使用到的欄位,不查詢所有欄位4:採用 capped collectioncapped collections 比普通collections的讀寫效率高5:採用profiling慢查詢日誌三效能監控(內建的2個工具)1:mongosniff 記載通訊記錄開啟2個視窗./mongosniff --source net lo A視窗執行./mongo --B視窗連結mongodb,能後 ,A視窗就已經記錄B的操作資訊,登入啊退出啊什麼的2:mongostat 監控(誰訪問,查刪啊。。。。。)./mongostat --A視窗執行,會每一秒會重新整理介面./mongo --B視窗連結mongodb,B執行的增刪查的記錄會在A視窗被監控到
後期在更新MongoDB進階知識
MongoDB常用命令及例子詳細介紹(三)