1. 程式人生 > >mogonDB基本操作命令

mogonDB基本操作命令

1,連線:
    1.    mogodb://mongodb的登入:usernanme:密碼@host(地址):埠號。
    2,連線多臺伺服器:    mongodb://伺服器1:埠號1,伺服器2:埠號2
    3,連線replica set三臺伺服器    mongodb://localhost(本機,預設埠27017),localhost:27018,localhost:20719
2,建立資料庫
    1,use databasename;if已經存在則切換到指定資料庫;show dbs:查詢所有資料庫的命令;新建的資料庫需要插入一條資料才能顯示出來。
3,刪除資料庫:db.dropDatabase():刪除當前資料庫。
4,集合(即資料庫中表的刪除)的刪除。db.collection.drop();db.指定表名.drop;
5,集合的建立:格式:db.createCollecion(name,options);name:集合名稱,options:可選引數,指定有關記憶體大小及索引的選項。
    show collections:檢視已有集合;
    建立固定集合的用法:db.createCollection("name",{capped(if為true,必須指定大小):true,aotoIndexId(自動在_id欄位建立索引):true,size(集合大小):6142800,max(文件最大個數,即行):10000})
6,向集合中插入文件:關鍵字不帶引號,值帶單引號。更新時都要帶單引號。
    db.集合名.insert(document):可以insert(key:value,key1:value2。。。)也可以var document=({key:value,key1,value1...});insert(document)的方式插入;
    每條文件有一個預設的_id;一個大括號為一條資料
7,更新集合中的文件,格式:db.collection.update(<query>,<update>,{upsert<bool>,multi:<bool>,writeConcern:<document>})
    query代表:update的查詢條件,類似where後面的語句;update代表更新的操作符,set後面的語句;upsert:bool型代表if不存在是否插入新的。multi:預設為false,代表只更新查詢到的第一條資料,true為全部更新
    writeConcern:可選,丟擲異常的級別。
    例項:db.col.update({'title':‘MongoDB 教程’},{$set:{‘title’:'MongoDB'}});將key_value,title:MongoDB 教程改成了title:MongoDB
    db.collectin.save(<document>,{wreiteConcern:<document>})
8,文件的刪除:db.col.remove({}):刪除所有文件;db.col.remove({document},1):刪除一條記錄;官方文件新用法:db.inventory.deleteMand({}):刪除集合下所有文件;
    db.inventory.deleteMany({status:"A"}):刪除status等於A的所有文件;db.inventory.deleteOne({status:"A"}):刪除status等於A的一條文件;
9,db.collection.find(query,projiection);query:可選,使用查詢操作符,指定查詢條件;projection:可選,查詢時返回文件所有的健值;
    db.col.find().pretty():pretty():以易讀的方式讀取資料
    db.col.find().pretty():查詢集合中的所有文件;findone:返回一個文件。查詢等於:db.col.find({"by":"mongodb"}).pretty();等價於 where by='mongodb'
    查詢大於等於:db.col.find({"likes":{$gte:50}}).pretty();等價於where likes>=50;查詢條件要單獨放在一個大括號裡
    查詢and條件:db.col.find({key1:value1,key2,value2}).pretty();多個查詢條件存入一個大括號中;
    查詢or條件:使用or關鍵字:db.col.find({$or:[{key1:value1},{key2,value2}]}).pretty();多個查詢條件存入一箇中括號中;
    AND和OR聯合使用: db.col.find({"likes":{$gt:50}},$or:[{key1,value1},{key2,value2}]}).pretty()
    projection的使用情況:db.collection.find(query,{key1:1,key2,:1})指定返回的健,if為0指定不返回的健;要不全為1,或全為0;不可混用;
    db.collection.find(query,{_id:0,title:1,by:1});指定_id為0,隱藏_id;
10,條件查詢:db.col.find({likes:{$lte|$gte|$lt|$gt:150}})查詢likes大於/小於/等於150的記錄
        模糊查詢:db.col.find({key:/教/});查詢key包含教字的文件;db.col.find.({/^教/});db.col.find.({/教$/});分別查詢教字開頭和結尾的文件
11,按資料型別條件查詢:db.col.find({"title":{$type:2|'string'}});查詢title型別為字串的文件;2是字串型別在mongdb中的編號;
12,查詢中limit()和skip()的用法:db.col.find({},{key1:1,_id:0}).limit(2).skip(1);查詢包含key1的兩條記錄跳過第一條;
13,排序:db.col.find().sort({key:1|-1});查詢所有資料,按key升序排列;-1為降序;
14,建立索引:db.col.createIndex({"key1":1,key2:-1});建立複合索引:key1升序,key2降序;
15,db.col.getIndexes():檢視集合索引;db.col.totalIndexSize():檢視集合索引大小;db.col.dropIndexs():刪除集合所有索引;db.col.dropIndex(“索引名稱”):刪除指定索引
16,聚合:aggregate:主要用於處理資料(如:統計平均值,求和等),並反回計算後的資料結果類似於count(*)
    db.col.aggregate([{$group:{_id:"$bu_user",num_tutorial:{$sum:1}}}])類似於select by_user count(*) from mycol group by by_user;計算麼個作者寫的文章數
    $sum|avg|min|max|addToSet|first|last ;db.col.aggregate({$group:{_id:"$by_user",num_tutorial:{$sum:"$likes"}}})
17,mongodb中的聚合管道:
    $project:修改輸入文件的結構。可以用來重新命名,增加刪除域也可以用來建立計算結果以及巢狀文件:可以用來指定篩選哪幾個欄位。
    $match:用於過濾資料,只輸出複合條件的文件。$match使用mongodb的標準查詢操作;db.col.aggregate([{$match:{socre:{$gt:70,$lt:90}}},{$group:{_id:null,count:{$sum:1}}}]);
    獲取指定範圍資料,將符合記錄送到下一階段進行處理
    $limit:用於限制聚合管道中返回的文件數
    $skip:跳過指定數量的文件,並返回餘下的文件
    $unwind:將文件中的某一個數組型別欄位拆分成多條,每條包含陣列中的一個值。
    $group:將集合中的文件分組,可用於統計結果。
    $sort:將輸入文件排序後輸出
    $geoNear:輸出接近某一地理位置的有序文件
18,複製原理:一個主負責處理客戶端的請求,其餘是從節點,負責複製主節點的資料。主節點記錄在其上的所有操作oplog,從節點定期輪詢主節點獲取這些操作,然後對自己的資料副本執行這些操作
    副本集的特徵:n個節點的叢集,任何節點可作為主節點,所有寫入操作都在主節點上,自動故障轉移,自動恢復。
19,分片:在mongodb裡存在另一種叢集,就是分片技術可以滿足資料量大量增長的需求,當mongodb儲存海量資料時,一臺機器不足以儲存資料,也可能不足以提供可接受的讀寫吞吐量。可通過在多臺機器上
分割資料,使得資料庫系統儲存和處理更多的資料
20,為什麼使用分片:複製所有的寫入操作到主節點。延遲的敏感資料會在主節點查詢。單個副本集限制在12個節點。當請求量巨大時會出現記憶體不足。本地磁碟不足。垂直擴充套件價格昂貴。
shard:儲存實際的資料塊config server:mongod例項,儲存了整個clusterMetaData,其中包含chunk資訊。Query Routers前端路由,客戶端由此接入,讓整個叢集看上去像單一資料庫
21:資料庫備份:mongodb -h dbhost -d dbname -o dbdirectory
    -h:資料庫所在伺服器地址,-d:需要備份的資料庫例項。-o: 備份的資料存放的位置。
    資料庫的恢復:mongoretore -h <hostname><:port> -d dbname <path>
    -h:資料庫伺服器所在地址及埠號 -d:需要恢復的資料庫例項。mongostat:檢視狀態,mongotop:提供每個集合的水平的統計資料。預設情況下每一秒返回一次
22,mongodb的關係表示多個文件之間在邏輯上的相互聯絡。可以通過嵌入和引用建立聯絡。
    user的文件結構: {_id:value,name:value,contac:value,dob:value} ;address的文件結構:{_id:value,building:vlaue,pincode:value,city:los,stat:Califor}
    嵌入關係:把使用者地址嵌入到使用者文件中: {_id:value,name:value,contac:value,dob:value,address:[{_id:value,building:vlaue,pincode:value,city:los,stat:Califor},{地址2}]}
    引用式關係:引用式關係是經常用到的關係,這種方法把使用者資料文件和使用者地址資料文件分開,通過引用文件的id欄位來建立關係{_id:value,name:value,contac:value,dob:value,address_id:[地址1,地址2]}
    這種方法需要兩次查詢:var result=db.users.findOne({name:value},address_ids:1);var address=db.address.find(_id,{$in:result[address_ids]})
23,資料庫的引用:手動引用,DBRefs
 在不同的集合中儲存不同的地址,在呼叫不同的地址時,也需要指定集合,一個文件從多個集合引用文件,使用DBRefs
 DBRefs:{$ref:,$id,$db:};$ref:集合名稱,$id:引用的id,$db:資料庫名稱,可選引數;
 24,覆蓋索引查詢:1,所有的查詢欄位是索引的一部分,所有的查詢返回欄位在同一個索引中。由於所有出現在查詢中的欄位是索引的一部分,因此無需在整個資料文件中檢索匹配查詢條件和返回使用相同
 索引的查詢結果。因為索引存在於RAM中,從索引中獲取資料更快。
25,mongodb不支援事務,但是提供了原子操作比如:文件的儲存,修改,刪除等都是原子操作。
    {$set:{filed:value}};$set用來指定一個建並更新建值,若不存在則建立。{$unset:{field:1}}用來刪除一個健;{$inc:{field:value}};用來對文件的某個值為數字型的健進行增減操作
    {{$push:{field:value}}};把value追加到filed裡面去,filed一定是陣列型別才行,如果不存在則新增加一個數組型別進去。
    {$pushAll:{field:value_array}};一次追加多個值到陣列欄位內。{$pull:{field:value}};從field內刪除一個等於value的值。$addToSet:增加一個值到陣列內,只有這個值不在陣列內才增加。
    $pop:刪除第一個或最後一個元素。{{$rename:{old_field_name:new_field_name}}}:修改欄位名稱。{$bit:{field,{and:5}}};位操作,integer型別
26,高階索引:文件中包含子文件和陣列;索引陣列欄位:db.col.ensureIndex({key:1});建立索引後,陣列key中的每一個欄位都具有了索引。
    索引子文件索引:db.col.ensureIndex({key1:1,key2:1,key3:1})為子文件中的三個欄位建立了索引。
    db.col.find({key:vlaue}).explain():檢視陣列key中value的索引。
27,索引佔據記憶體所以有限制,或不使用。集合中索引不能超過64個,索引名的長度不能超過128個字元,一個複合索引最多可以有31個欄位
28,物件id(Objectid)共12個位元組:前四個位元組表示時間戳,接下來三個位元組是機器標識碼,緊接的兩個位元組是由程序id組成,最後三個位元組是隨機數。
29,Objectid("").getTimestamp():將獲得時間戳
30,map_reduce是一種計算模型,將大批量的工作資料分解map執行,然後將結果合併成最終結果(reduce)
    基本語法:db.col.mapReduce(
    function() {emit(key,value);},//map函式
    function(key,vlaues) {return reduceFunction},//reduce函式
    {
    out:collection,
    query:document,
    sort:document,
    limit:number
    }
    )
    使用mapreduce函式要實現兩個含map函式和reduce函式。map函式呼叫emit(key,value),遍歷collection中所有的記錄,將key與value傳遞給Reduce函式進行處理。
    map函式必須呼叫emit(key,value)返回鍵值對。
引數說明:map:對映函式(生成健值對序列,作為reduce函式引數)。reduce統計函式:將key——values變成key-value即將values陣列變成一個單一的value
    out:統計結果存放集合(不指定則使用臨時集合,在客戶端斷開後自動刪除)。query一個篩選條件,只有滿足條件的文件才會呼叫map函式(query,limit,sort可以隨意組合)
    sort和limit結合的sort結合的sort排序引數(發給map函式前給文件排序),可以優化分組機制。
    limit;發給map啊很好的文件的數量上限。
    在集合orders中查詢status:"A"的資料,並根據cust_id來分組,並計算amount的總和
例項:db.collection.mapReduce(
        funciton(){emit(this.cust_id,this.amount)};
        function(key,values){return Array.sum(values)},
        {query:{status:"A"},
        out:order_totals
        })
31,建立全文索引:db.posts.ensureIndex({post_test:"test"});對欄位post_test建立全文索引,這樣可以搜尋文章內的內容;
    使用全文索引:db.posts.find({$test:{$search:"runoob"}});db.posts.getIndexs():查詢索引名。刪除索引名:db.posts.dropIndex(“post_test_test”)
32,支援使用正則表示式查詢。
33,介面管理:RockmongoDB
34,GridFS:用於儲存和恢復那些超過16M的檔案(圖片、音訊、視訊等)它也是檔案儲存的一種的方式,可以更好的儲存大於16M的檔案,將大檔案物件分割成多個小的chunk片段,每個chunk作為mongodb的一個
文件儲存在chunks集合中。GridFs用兩個集合來儲存一個檔案。fs.files和fs.chunks
db.fs.files.find();檢視資料庫中的文件;根據檔案的_id。獲取區塊的資料。db.fs.chunks.find(files_id:Objectid(""))