MongoDB 安裝配置

jopen 12年前發布 | 27K 次閱讀 MongoDB NoSQL數據庫

MongoDB 是一個高性能,開源,無模式的文檔型數據庫,采用C++開發,是當前NoSQL數據庫中比較熱門的一種,在許多場景下可用于替代傳統的關系型數據庫或鍵/值存儲方式

MongoDB使用BSON作為數據存儲和傳輸的格式,BSON是一種類似JSON的二進制序列化文檔,支持嵌套對象和數組。MongoDB很像MySQL,document對應MySQL的row,collection對應MySQL的table

MongoDB服務端可運行在Linux、Windows或OS X平臺,支持32位和64位應用,默認端口為27017。推薦運行在64位平臺,因為MongoDB在32位模式運行時支持的最大文件尺寸為2GB


1,特點和功能

1) 特點

  • 高性能、易部署、易使用,存儲數據非常方便。
  • 面向集合存儲,易存儲對象類型的數據,模式自由。
  • 支持動態查詢,支持完全索引,包含內部對象。
  • 支持復制和故障恢復。
  • 使用高效的二進制數據存儲,包括大型對象(如視頻等)。
  • 自動處理碎片,以支持云計算層次的擴展性
  • 支持Python,PHP,Ruby,Java,C,C#,Javascript,Perl及C++語言的驅動程序,社區中也提供了對Erlang及.NET等平臺的驅動程序。
  • 文件存儲格式為BSON(一種JSON的擴展),可通過網絡訪問。
  • </ul>

    2) 功能

    • 面向集合的存儲:適合存儲對象及JSON形式的數據。
    • 動態查詢:Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
    • 完整的索引支持:包括文檔內嵌對象及數組。Mongo的查詢優化器會分析查詢表達式,并生成一個高效的查詢計劃。
    • 查詢監視:Mongo包含一個監視工具用于分析數據庫操作的性能。
    • 復制及自動故障轉移:Mongo數據庫支持服務器之間的數據復制,支持主-從模式及服務器之間的相互復制。復制的主要目標是提供冗余及自動故障轉移。
    • 高效的傳統存儲方式:支持二進制數據及大型對象(如照片或圖片)
    • 自動分片以支持云級別的伸縮性:自動分片功能支持水平的數據庫集群,可動態添加額外的機器。
    • </ul>

       

      2,  適用場合

      1. 網站數據:Mongo非常適合實時的插入,更新與查詢,并具備網站實時數據存儲所需的復制及高度伸縮性。
      2. 緩存:由于性能很高,Mongo也適合作為信息基礎設施的緩存層。在系統重啟之后,由Mongo搭建的持久化緩存層可以避免下層的數據源 過載。
      3. 大尺寸,低價值的數據:使用傳統的關系型數據庫存儲一些數據時可能會比較昂貴,在此之前,很多時候程序員往往會選擇傳統的文件進行存儲。
      4. 高伸縮性的場景:Mongo非常適合由數十或數百臺服務器組成的數據庫。Mongo的路線圖中已經包含對MapReduce引擎的內置支持。
      5. 用于對象及JSON數據的存儲:Mongo的BSON數據格式非常適合文檔化格式的存儲及查詢。
      6. </ol>
        3, 下載安裝

        mongoDB 下載, 最新版本 mongodb-linux-x86_64-2.2.3.tgz

        mongoDB 安裝:

        tar zxvf mongodb-linux-x86_64-2.2.3.tgz

        cd mongodb-linux-x86_64-2.2.3

        sudo mkdir /opt/mongodb-2.2.3

        sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/

         

        安裝完畢后,在瀏覽器URL欄輸入: http://localhost:27017/,出現下面內容則表示安裝成功!

        1360033595_5804.png

         

        上圖,提示端口號加上1000,然后通過HTTP訪問,于是在瀏覽器地址欄輸入:http://localhost:28017,訪問界面如下:

        20131029131434546.png

         

         

        4, 啟動關閉

        1) 默認啟動

        sudo ./bin/mongod    (默認保存文件目錄為/data/db/, 沒有則新建 sudo mkdir -p /data/db/, 默認端口為27017)

         

        2)指定目錄啟動

        sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/       (保存文件目錄為/opt/mongodb-2.2.3/ , 沒有則新建)

         

        3) 指定端口啟動

        sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/ -p 27000        (端口修改為指定27000),啟動輸出如下:

        MongoDB starting : pid=4222 port=27000 dbpath=/opt/mongodb-2.2.3/ 32-bit host=ubuntu

        mongodb.conf配置文件啟動:

        homer@ubuntu:~$ cat /opt/mongodb/mongodb.conf    
        port=27017
        dbpath=/opt/mongodb/data/
        logpath=/opt/mongodb/log/mongodb.log
        logappend=true

        啟動命令:

        /opt/mongodb/bin/mongod -f /opt/mongodb/mongodb.conf &

         

        4) 后臺啟動命令

        sudo ./bin/mongod -shardsvr -replSet shard1 -port=27017 -dbpath=/opt/mongodb-2.2.3/ -logpath=/opt/mongodb-2.2.3/log -logappend -rest -fork

         

        5) 后臺關閉命令

        $ .bin/mongod                       // 登錄客戶端
        > use admin                          // 切換到管理員
        > db.shutdownServer()         // 關閉mongodb

        或者

        > db.adminCommand({shutdown : 1, force : true})
        > //or
        > db.shutdownServer({force : true})

        > db.adminCommand(shutdown : 1, force : true, timeoutsec : 5)      
         // 超時關閉
        > //or
        > db.shutdownServer({force : true, timeoutsec : 5})

         

        6) 客戶端啟動

        默認啟動: ./bin/mongo

        指定端口啟動: ./bin/mongo --port 27000

         

        7) 備份與恢復

            $ sudo ./bin/mongodump -d foo -o /opt/mongodb-2.2.3/bk/                  // 備份到bk目錄  
            connected to: 127.0.0.1  
            Tue Feb  5 20:58:13 DATABASE: foo    to     /opt/mongodb-2.2.3/bk/foo  
            Tue Feb  5 20:58:13     foo.foo_test to /opt/mongodb-2.2.3/bk/foo/foo_test.bson  
            Tue Feb  5 20:58:13          1 objects  
            Tue Feb  5 20:58:13     Metadata for foo.foo_test to /opt/mongodb-2.2.3/bk/foo/foo_test.metadata.json  
            $ ./bin/mongorestore -d foo -c foo_test /opt/mongodb-2.2.3/bk/foo/foo_test.bson          // 恢復foo_test集合  
            connected to: 127.0.0.1  
            Tue Feb  5 20:58:20 /opt/mongodb-2.2.3/bk/foo/foo_test.bson  
            Tue Feb  5 20:58:20     going into namespace [foo.foo_test]  
            Tue Feb  5 20:58:20 warning: Restoring to foo.foo_test without dropping. Restored data will be inserted without raising errors; check your server log  
            Tue Feb  5 20:58:20 WARNING: collection foo.foo_test exists with different options than are in the metadata.json file and not using --drop. Options in the metadata file will be ignored.  
            1 objects found  
            Tue Feb  5 20:58:20     Creating index: { key: { _id: 1 }, ns: "foo.foo_test", name: "_id_" }  

         

        5, 命令示例

        1) 啟動服務端

        sudo ./bin/mongod --dbpath=/opt/mongodb-2.2.3/

         

        2) 啟動客戶端

        ./bin/mongo

         

        3) 客戶端簡單命令

        幫助: help

        顯示數據庫: show dbs;

        選擇數據庫: use test;

         

        插入數據: db.foo.save({homer:2}); 

        查詢: db.foo.find();

        結果: { "_id" : ObjectId("511078ad857b699e9eaaf516"), "homer" : 2 }

        更新: db.foo.update({"homer":2},{"homer":3});         // ( {}, {} ) 第一個{}是查詢條件,第二個{}是重新賦值

        結果: { "_id" : ObjectId("511078ad857b699e9eaaf516"), "homer" : 3 }

         

        刪除: db.foo.remove({"homer":3});

         

        復合插入:

        > t={"homer":2, "name" : {"name1" : "yang", "name2" : "gang"} }
        { "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }
        > db.foo.insert(t);
        > db.foo.find();
        { "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }

         

        復合查詢:

        > db.foo.find();              // 先查看集合中所有記錄
        { "_id" : ObjectId("5110ca1aaf69ad089b233fff"), "homer" : 222 }
        { "_id" : ObjectId("5110caffaf69ad089b234000"), "homer" : 222 }
        { "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }


        > db.foo.find({"homer":2});           // 查詢包含特定內容的記錄
        { "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }

         

        MongoDB 創建示例:

            > use test2                // test2數據庫不存在也可以執行,但不會立刻創建,需要執行insert操作時才創建  
            switched to db test2  
            > show dbs                 // 沒有test2,表明不是立刻創建  
            local   (empty)  
            test    0.0625GB  
            >  
            > db                       // 顯示當前正在使用的數據庫,test2不存在但正在使用中  
            test2  
            > db.createCollection("t2_test")     // 創建集合  
            { "ok" : 1 }  
            > t={"name": "yanggang", "sex" : "male", "lover" : { "lover1" : "little dog", "lover2" : "fish" }}           // 初始化集合數據  
            {  
                "name" : "yanggang",  
                "sex" : "male",  
                "lover" : {  
                    "lover1" : "little dog",  
                    "lover2" : "fish"  
                }  
            }  
            > db.t2_test.insert(t)            // 插入數據,此刻才會創建test2數據庫  
            > db.t2_test.find()               // 查詢  
            { "_id" : ObjectId("5110d685af69ad089b234002"), "name" : "yanggang", "sex" : "male", "lover" : { "lover1" : "little dog", "lover2" : "fish" } }  
            > show dbs                        // 查看數據庫,多了test2  
            local   (empty)  
            test    0.0625GB  
            test2   0.0625GB  

        MongoDB 刪除示例:

            > show collections        // 顯示集合  
            system.indexes  
            t2_test  
            > db.t2_test.drop()       // 刪除集合t2_test  
            true  
            > show collections        // 驗證刪除成功  
            system.indexes  
            > db.test2.remove()  
            > show dbs                // 顯示數據庫  
            local   (empty)  
            test    0.0625GB  
            test2   0.0625GB  
            > db                      // 顯示當前數據庫  
            test2  
            > db.dropDatabase()       // 刪除數據庫  
            { "dropped" : "test2", "ok" : 1 }  
            > show dbs                // 驗證刪除成功  
            local   (empty)  
            test    0.0625GB  

         

        MongoDB 索引

            > db.foo.find()  
            { "_id" : ObjectId("5110ca1aaf69ad089b233fff"), "homer" : 222 }  
            { "_id" : ObjectId("5110caffaf69ad089b234000"), "homer" : 222 }  
            { "_id" : ObjectId("5110d3e0af69ad089b234001"), "homer" : 2, "name" : { "name1" : "yang", "name2" : "gang" } }  
            > db.foo.getIndexes()                        // 查看索引(_id為默認,不可刪除和修改)  
            [  
                {  
                    "v" : 1,  
                    "key" : {  
                        "_id" : 1  
                    },  
                    "ns" : "test.foo",  
                    "name" : "_id_"  
                }  
            ]  
            > db.foo.ensureIndex({"homer":1})            // 新建索引  
            > db.foo.getIndexes()                        // 驗證新建索引  
            [  
                {  
                    "v" : 1,  
                    "key" : {  
                        "_id" : 1  
                    },  
                    "ns" : "test.foo",  
                    "name" : "_id_"  
                },  
                {  
                    "v" : 1,  
                    "key" : {  
                        "homer" : 1  
                    },  
                    "ns" : "test.foo",  
                    "name" : "homer_1"  
                }  
            ]  
            > db.foo.dropIndex({"homer":1})              // 刪除索引  
            { "nIndexesWas" : 2, "ok" : 1 }  
            > db.foo.getIndexes()                        // 驗證刪除索引  
            [  
                {  
                    "v" : 1,  
                    "key" : {  
                        "_id" : 1  
                    },  
                    "ns" : "test.foo",  
                    "name" : "_id_"  
                }  
            ]  

         

        6, 應用示例

        > db.foo_test.insert({"homer":1})  
        > for(var i = 1; i<=5; i++) db.foo_test.save({"homer":2, "score":i})            // 數組生成  
        > db.foo_test.find()  
        { "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }  
        { "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49ab"), "homer" : 2, "score" : 2 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49ae"), "homer" : 2, "score" : 5 }  
        >   
        > var cursor = db.foo_test.find(); while(cursor.hasNext())printjson(cursor.next());      // 遍歷數組  
        { "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }  
        { "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49ab"), "homer" : 2, "score" : 2 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49ae"), "homer" : 2, "score" : 5 }  
        >   
        > var cursor = db.foo_test.find(); printjson(cursor[4])                          // 查詢(迭代)  
        { "_id" : ObjectId("511103200e2d3a50c56b49ac"), "homer" : 2, "score" : 3 }  
        > var arr = db.foo_test.find().toArray(); arr[5]                             // 查詢(數組)  
        { "_id" : ObjectId("511103200e2d3a50c56b49ad"), "homer" : 2, "score" : 4 }  
        > db.foo_test.find().limit(3)                                                    // 查詢(前三)  
        { "_id" : ObjectId("5111016cc0e386db7d954ae7"), "homer" : 1 }  
        { "_id" : ObjectId("5111030f0e2d3a50c56b49a9"), "homer" : 2, "score" : 6 }  
        { "_id" : ObjectId("511103200e2d3a50c56b49aa"), "homer" : 2, "score" : 1 }  
 本文由用戶 jopen 自行上傳分享,僅供網友學習交流。所有權歸原作者,若您的權利被侵害,請聯系管理員。
 轉載本站原創文章,請注明出處,并保留原始鏈接、圖片水印。
 本站是一個以用戶分享為主的開源技術平臺,歡迎各類分享!