mongodb 學習


 

NoSql:not only sql 非關系型數據庫

面向對象式的 

新浪微博:redis
google :bigtable
amazon:simpledb
淘寶:tair
視覺網站:mongodb
優酷運營數據分析:mongodb
飛信空間:handlersocket
豆瓣社區:beansdb

優缺點:
    優點:
        簡單的擴展
        快速的讀寫
        低廉的成本
        靈活的數據模型
    
    缺點:
        只是在局部展現出某些優勢
        不提供對sql的支持
        支持的特性不夠豐富
        現有的產品不夠成熟
        
        
相對成熟的產品  mongodb,redis
    是一個面向集合的,模式自由的文檔型數據庫

    
    
面向集合:

文件存儲格式:bson(二進制的json)

使用場景:
    持久化的緩存層
    高效的實時性
    用於對象以及json數據的存儲
    高伸縮性的場景
    大尺寸,低價值的數據存儲
    

不適用:
        高度事務
        傳統的商業智能應用
        復雜的多表查詢

         
安裝簡單:
    不需要編譯
    
    
    
啟動:
建立數據庫目錄:data
日志文件:dblogs
E:\mongodb\bin\mongod.exe --dbpath=e:\mongodb\data --logpath=e:\mongodb\dblogs --install
    
    
    默認進入:test庫
        
    關閉:kill -all  進程號
          pkill 進程名
          不要用kill -9 否則會產生鎖文件

命令:
    show dbs
    exit
    db 當前數據庫
    show tables /show collections  當前數據庫的集合
    
    
對比:
        mysql    數據庫(database)    表(table)    記錄(rows)
        mongodb    數據庫(database)    集合(collection)    文檔對象(document)
        

隱式創建數據庫和表:
        db.c1.insert({name:"songjiankang"});
        db.c1.find()
        show users  查看所有用戶
        db.dropdatabase()
        
        
        db.c1.remove();  //刪除所有
        db.c1.update({name:"user1"},{name:"user00"})
        
        
    
    
    
    
    objectid:時間+機器號+進程號+編號  即使把多個集合的數據完全合並都不會沖突
    
數據類型:
        null    {"one":null}
        布爾    {"one":true}
        32位整數
        64位的整數
        64位的浮點數
        字符串
        符號
        objectId類型    對象id是文檔中唯一的12位的id
                        0|1|2|3|4|5|6|7|8|9|10|11
                        時間戳 機器 pid 計數器
        日期  {"one":newDate()}
        正則    
        代碼  文檔中可以包含js代碼{"one":function(){}}
        數組:值可以為數組 還可以嵌套{"one":["a",["b","c"]]}
        內嵌文檔  文檔可以包含別的文檔,也可以作為值嵌入到父文檔中
                {"x":{"name":"jian"}}
        
        
    insert    save(replace)    
    
    js    動態插入
    for(i=0;i<10;i++){
... db.c1.insert({user:'name'+i});
... }
    //取哪些字段(要的為1,不要的為0,默認會取出_id)
    db.c1.find({user:"name1"},{user:1,_id:0});
    db.c1.find({age:{$gt:5}});
    db.c1.find({age:{$lte:5}});
    db.c1.find({age:{$ne:5}});
    db.c1.count();
    db.c1.find().sort({age:-1});//降序
    db.c1.find().sort({age:1});//升序
    db.c1.find().limit(8)//取多少個
    db.c1.find().skip(10).limit(8)//取多少個
    db.c2.find({age:{$all:[1,2,4,4444]}});//包含
    db.c2.find({age:{$exists:1}});//檢測字段是否存在
    db.c2.find({age:{$mod:[2,1]}});//取余操作
    
    db.c1.update({name:"user1"},{name:"user2"});//當有滿足前面的條件的時候時,直接更新,當不滿足前面的條件時,如果有第三個參數1,則會當一條新記錄插入進去
    
    db.c1.update({name:10},{$set:{name:100}},0,1);//更新全部符合條件的記錄
    db.c1.update({name:100},{$set:{age:1000}},0,1);//把滿足條件的增加age字段

    db.c1.update({"age":50},{$inc:{"ages":100}},0,1);
    //$set $inc 在字段沒有的情況下都會自動增加字段,當條件存在時第三個參數不起作用,第四個參數代表更新記錄的行數
    
     db.c1.update({},{$unset:{ages:1}},0,1);//去除多余的字段
     
     db.c1.update({name:"user1"},{$push:{arr:5}});//在val是數組的里面增加值,一次只能增加一個
     
     db.c1.update({name:"user1"},{$pushAll:{arr:[7,8,9]}});//在val是數組的里面增加值,一次只能增加一個
     
     db.c1.update({name:"user1"},{$pop:{arr:1}});//值為數組的減去一個值
    
    $addToSet 同$push 類似,只是前者會檢測重復性
    db.c1.update({name:"user1"},{$addToSet:{arr:{$each:[1,2,,3,4,5,6]}}});//壓入一個數組並檢測其重復性
        
    
    db.c1.update({name:"user1"},{$pull:{arr:1}});//刪除數組中值為1的元素
    db.c1.update({name:"user1"},{$pullAll:{arr:[2,3,4]}});//一次性刪除數組中多個元素
    
    db.c1.update({name:"user1"},{$rename:{"name":"kang"}},0,1);//重命名key
    
    
    { "_id" : ObjectId("50358b45c3fec12531a5f899"), "arr" : [       {       "class" : "php" },      {       "class" : "mysql" },    {       "class" : "java" },     {      "class" : "javascript" },        {       "class" : "java" } ], "name" : "user1" }

    查找上面的記錄: db.c1.find({"arr.class":"java"});
     db.c1.update({"name.user1":'a'},{$set:{"name.$.user1":"aaaaaaaaaaaa"}});//注意:連寫的key都要引起來
     
     var x = db.c1.findOne({"user":"user1"});//x相當於一個json對象
     可以用x來動態修改 x.age = 10;   db.c1.save(x);//修改到對象中

    ————————————————————————————————————————————————————————————————————
    
    db.c1.drop();//刪除表
    db.stats();
    db.dropDatabase();//刪除當前數據庫
    use test;有的進入,沒有則創建
    db.createCollection("c2");//顯式創建集合
    ——————————————————————————————————————————————————————————————————————————
    普通集合:動態增長
    固定集合:可以更新,但不可以超過總大小,不允許刪除,但可以drop()刪除所有的行,drop后需要顯式的重建集合,32位機器上一耳光capped collection的最大值約482.5M,64位上只受系統文件大小的限制
    好處:    插入速度極快
            按照插入順序的查詢輸出速度極快
            能夠在插入最新數據時,淘汰最早的
    用處:存儲日志信息
           緩存一些少量的文檔
    
    創建固定集合(必須顯式創建):db.
    db.createCollection("c3",{capped:true,size:10000,max:3});(沒有索引)
    先根據容量限制進行淘汰,在根據文檔個數限制進行淘汰
    
    普通轉固定集合:
    db.runCommand({convertToCapped:"c1",size:100000,max:3});
    
    gridfs:用來存儲大的二進制文件
        存儲巨大文件:視頻高清圖片
        利用gridfs可以簡化需求
        直接利用已經建立的復制或分片機制,故障恢復和擴展都很容易
        避免用戶上傳內容的文件系統出現問題
        不產生碎片
        
    fs.files  上傳文件的基本信息
    fs.chunks 二進制文件
    
     db.fs.chunks.find();
     db.fs.files.find();
     mongofiles list / get/ put /delete 
     
      md5sum mongo//計算md5值
     

    ___________________________________________________________________
    索引:
    system.indexes索引
    db.fs.files.drop();
    db.fs.chunks .drop();
    
    db.c1.find().explain();//查看是否用到索引
     
    db.c1.ensureIndex({name:1}) //name上建立索引 1為升序,-1為降序
    db.c1.getIndexKeys();//查看索引狀態
    db.c1.getIndexes()//詳細查看
    
    db.c1.ensureIndex({age:1},{unique:1});//建立唯一索引:
    db.c1.dropIndex({"name":1});//刪除索引
    db.c1.dropIndexes();    //刪除所有索引
    
    
    優化器:profile慢查詢工具
    1.開啟方式:db.setProfilingLevel(2);//0:不開啟,1:記錄慢命令(默認100ms),2:記錄所有命令
    
    
    查看是否開啟慢查詢:db.getProfilingLevel();
    
    db.systme.profile().find().sort({$natural:-1}).limit(1);
    ts:時間
    info:命令的詳細信息
    reslen:返回結果集的大小
    nscanned:本次查詢掃描的記錄數
    nreturn:本次查詢實際返回的結果集
    millis:耗時(毫秒)
    
    show Profile可列出最近5條超過1ms的記錄
    限制返回的條數:db.c1.find().sort({ts:-1}).limit(10);
    查詢指定的字段:db.c1.find({},{ts:1,title:1}).sort({ts:-1}).limit(10);
    
    性能監控工具(監視網絡情況):
    /usr/local/mongodb/bin/mongosniff --source net lo
     
    /usr/local/mongodb/bin/mongostat
    
    數據的導出:/usr/local/mongodb/bin/mongoimport -d test -c c1 -o /tmp/song.data
    導入:/usr/local/mongodb/bin/mongoimport -d test -c c1 /tmp/song.data
    
    備份數據庫:
     ./mongodump -d test -o /tmp/
    回復數據庫:
     ./mongorestore -d test /tmp/test
     
用戶和授權:
    默認不進行驗證
    兩類用戶:超級用戶,每個數據庫的用戶
        默認用戶超級管理員登陸
    /usr/local/mongodb/bin/mongod --auth -dbpath=/usr/local/mongodb/data -logpath=/usr/local/mongodb/dblogs --profile 2 & (授權登陸)
    
    啟動的時候帶 --auth 登陸才受限制
    
    
    //設定用戶以后,匿名用戶就沒有權限了
    use admin(注意admin里面的為超級管理員--特殊)
    db.addUser("root",123456);//增加用戶
    db.auth("root",123456);
    
    登陸的時候必須指定指定數據庫的指定用戶 
    /usr/local/mongodb/bin/mongo -u root -p 123456 localhost:27017/admin 
    
    主從集群:
        master-slave主從復制
        replica sets復制(副本集) 當有一台宕機以后,會發組播從新選舉出一台住服務器
     
     實驗(主從復制):
     啟動主:
        master: /usr/local/mongodb/bin/mongod --master -dbpath=/usr/local/mongodb/data1 --logpath=/usr/local/mongodb/dblogs1 --port 20000 &

     啟動從:
     /usr/local/mongodb/bin/mongod --slave --source 127.0.0.1:20000  -dbpath=/usr/local/mongodb/data2 --logpath=/usr/local/mongodb/dblogs2  --port 20001 &
     ______________________________________________________________
     副本集:
     啟動多個(只是配置文件不同)
        1》 ./mongod --replSet rs1 --keyFile=/usr/local/mongodb/key/key1 --port 20000 --dbpath=/usr/local/mongodb/data/data1/ -logpath=/usr/local/mongodb/log/log1 --fork
        2》登陸一個,然后配置下(會議清單)
            config_rs1={
                _id:"rs1",
                members:[
                {_id:0,host:"localhost:20000",priority:1},
                {_id:1,host:"localhost:20001",priority:2}
                ]
            }
            
             rs.initiate(config_rs1);//初始化配置
             從的需要 rs.slaveOk();才可以查看
             
             
     
     安裝mogo php擴展:
     打模塊
     1.解壓模塊,在目錄下運行/bin/phpize
     2.  ./configure  --with-php-config=/www/wdlinux/php/bin/php-config  --enable-mongo
     3.make && make install
     4.php.ini中添加模塊的路徑 
            1>extension_dir = "/www/wdlinux/nginx_php-5.2.17/lib/php/extensions/no-debug-zts-20060613"
            
            2>extension=mongo.so
    
    以授權方式連接mongodb:"mongodb://root:123456@localhost:27017/admin"
    

        $conn = new Mongo("mongodb://root:123456@localhost:27017/admin");
        $db = $conn->test;
        $c1 = $db->c1;
        $arr = array();
        $res = $c1->find($arr);
        foreach($res as $val){            
            print_r($val);
        }

    
    

 

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM