MongoDB常用命令及例子詳細介紹(三)

來源:互聯網
上載者:User

標籤: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常用命令及例子詳細介紹(三)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.