qileilove

          blog已經轉移至github,大家請訪問 http://qaseven.github.io/

          NoSql數據庫初探-mongoDB環境搭建

          NoSQL數據庫一改關系型數據庫的缺點,更容易的集成、分布式、無模式、故障恢復等特點,正在一步步餐食關系型數據庫的市場,作為一個與時俱進的碼農了解一下新技術是必須的,尤其是在讀了《NoSql精粹》之后,更是想體驗一下NoSql數據庫的威力。
            MongoDB是一種文檔數據庫,也就是說對于領域模型中的每一個聚合來講,都會作為一個文檔來存儲。
            MongoDB有如下優點:
            面向文檔存儲、全索引支持、同步機制和高訪問性、自動分片、查詢、靈活的聚集和數據處理、映射化簡、文件存儲。
            第一步:安裝
            從版本2.2開始,mongoDB就不支持XP操作系統了,蛋疼,現在我就在用XP,看來只能用2.2之前的版本了,
            可用的版本只有一個2.0.9,我已經共享到百度網盤了,下載地址:http://pan.baidu.com/s/1i3GEs1v,如果下載地址失效了,請去官網下載。
            第二步:設置數據庫環境并啟動數據庫
            將壓縮版解壓之后放到任意一個硬盤上,比如我就放到了E:\mongodb-win32-i386-2.0.9
            先創建一個存放文檔文件的文件夾,E:\mongodb-win32-i386-2.0.9\data此文件夾是用來存放數據文檔的
            創建完成之后,將此文件夾配置到mongoDB,讓mongoDB將數據存放到此文件夾。
            配置并啟動數據庫:
            運行命令行:E:\mongodb-win32-i386-2.0.9\bin\mongod.exe --dbpath E:\mongodb-win32-i386-2.0.9\data
           ?。ㄈ绻麤]有指定,mongoDB啟動時默認在路徑C:\data下存放數據文檔)
            第三步:
            數據庫啟動之后,我們就可以連接數據庫進行訪問并存儲數據了
            另起一個命令窗口并運行:E:\mongodb-win32-i386-2.0.9\bin\mongo.exe --dbpath E:\mongodb-win32-i386-2.0.9\data
            后面的參數是要連接到的數據目錄
            默認情況下mongoDB會選中一個名叫test的數據庫,如果不知道當前所處的數據庫,可以運行db命令來查看
            查看所有的數據庫:
            show dbs
            切換數據庫:
            use mydb
            如果此時切換的數據庫不存在,沒關系,只要不向該數據庫存放數據,mongoDB是不會在硬盤上創建該數據庫的。
            是該存放數據的時候了,先說一下mongoDB中的一些概念。
            mongoDB中有db、collection、document,db就對應關系數據庫中的數據庫,而collection則對應了關系型數據庫中的表,而document就對應了關系型數據庫表中的一行數據。mongoDB中的文檔就像一個json文件一樣,我們可以將一個javascript中的對象字面量創建為一個document,如通過如下方式定義了兩個對象變量:
            j = { name : "mongo" }
            k = { x : 3 }
            將j和k這兩個文檔存入名為“testData”的collection中
            1
            2
            db.testData.insert( j )
            db.testData.insert( k )
            前面已經說過了,db為當前所處的數據庫對象,而testData是一個collection,此時還沒有對應的collection,當insert執行完畢之后,就創建了collection對象
            我們可以通過
            show collections
            命令來查看當前數據庫中所有的collection
            此時會返回testData和 system.indexes, system.indexes是mongoDB自己提供的collection,不用管它
            我們可以通過如下語句查詢testData中的所有的數據
            db.testData.find()

          此時的find方法會返回一個游標對象
            因為此時并沒有一個變量接收該游標對象,所以會默認至多打印出20條數據(當然只會打印剛剛的那兩條數據,因為我們的testData中只有這兩條)
            { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
            { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
            _id屬性是mongoDB自動生成的,因為每個文檔都要有一個“主鍵”(跟關系型數據庫中主鍵很像),而此時我們并沒有提供_id。
            我們來試著添加更多的數據:
            在命令行中輸入:
            for (var i = 1; i <= 25; i++) db.testData.insert( { x : i } )
            一個for循環,循環插入了25條數據
            我們再執行一下
            db.testData.find()
            結果輸出

          { "_id" : ObjectId("4c2209f9f3924d31102bd84a"), "name" : "mongo" }
          { "_id" : ObjectId("4c2209fef3924d31102bd84b"), "x" : 3 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990be9"), "x" : 4 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bea"), "x" : 5 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990beb"), "x" : 6 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bec"), "x" : 7 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bed"), "x" : 8 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bee"), "x" : 9 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bef"), "x" : 10 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bf0"), "x" : 11 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bf1"), "x" : 12 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bf2"), "x" : 13 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bf3"), "x" : 14 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bf4"), "x" : 15 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bf5"), "x" : 16 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bf6"), "x" : 17 }
          { "_id" : ObjectId("51a7dc7b2cacf40b79990bf7"), "x" : 18 }
          has more

            只輸出了20條數據
            后面還有has more提示后面還有數據
            再在命令行中輸入it會輸出下一批20條數據
            如何才能將數據全部輸出呢?
            此時我們用一個變量來接收游標:
            var c = db.testData.find()
            c就是游標對象
            此時我們通過for循環將全部數據輸出:
            while ( c.hasNext() ) printjson( c.next() )
            printjson方法將文檔以json的格式輸出
            游標對象的hasNext方法用來判斷是否還有下一個文檔,而next方法用來獲取下一個文檔。
            如果我們只想獲取第5個文檔,該怎么辦呢?
            當然可以在遍歷游標的時候對遍歷過的文檔計數,并將第5個文檔輸出即可,但是這種方式確實是有點啰嗦了。
            我們此時可以在游標對象上直接添加一個下標即可,如:
            printjson( c [ 4 ] )
            此時輸出了第5個文檔
            { "_id" : ObjectId("51a7dc7b2cacf40b79990bea"), "x" : 5 }
            但是此時請注意:
            c [ 4 ]方法會將所有該collection下的文檔讀取進內存,這相當于在游標上執行了cursor.toArray() 方法,
            此方法將所有的文檔加載到了內存中,然后再在返回的數組中查找索引值是4的文檔,所以游標下標方法應慎用啊
            如果我們想查詢a是18的那個document該怎么辦呢?
            此時我們還可以借助find方法,但是此時要給find方法提供一個模板文檔
            一個模板文檔詳細描述了查詢策略,如:db.testData.find( { x : 18 } )
            此時的{x:18}就是一個模板文檔,是指查詢文檔時只保留x為18的文檔。
            查詢結果如下:
            { "_id" : ObjectId("51a7dc7b2cacf40b79990bf7"), "x" : 18 }
            不要忘了,find方法返回一個游標對象,只不過此時的查詢只有一個文檔符合條件。
            如果只想返回一個文檔,而不是游標對象,可以使用findOne方法,findOne方法返回一個文檔對象,不管符合條件的文檔有多少個,它只返回第一個。
            如果想對返回的文檔數目進行限制,可以在游標上調用limit方法,如下:
            db.testData.find().limit(3)
            只會返回前3個文檔
            結果如下:
            { "_id" : ObjectId("51a7dc7b2cacf40b79990be6"), "x" : 1 }
            { "_id" : ObjectId("51a7dc7b2cacf40b79990be7"), "x" : 2 }
            { "_id" : ObjectId("51a7dc7b2cacf40b79990be8"), "x" : 3 }

          posted on 2014-07-22 09:29 順其自然EVO 閱讀(203) 評論(0)  編輯  收藏 所屬分類: 數據庫

          <2014年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789

          導航

          統計

          常用鏈接

          留言簿(55)

          隨筆分類

          隨筆檔案

          文章分類

          文章檔案

          搜索

          最新評論

          閱讀排行榜

          評論排行榜

          主站蜘蛛池模板: 海盐县| 海伦市| 图片| 新乡市| 余江县| 乐都县| 岳西县| 临颍县| 大关县| 华宁县| 印江| 嘉善县| 佳木斯市| 即墨市| 镇赉县| 呼玛县| 明溪县| 诏安县| 南昌市| 大洼县| 洛川县| 彰化县| 阳江市| 商城县| 无为县| 平谷区| 郴州市| 静乐县| 仁布县| 焦作市| 昌宁县| 射阳县| 马山县| 黄大仙区| 汕尾市| 中西区| 南木林县| 龙胜| 保定市| 满洲里市| 崇仁县|