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) 編輯 收藏 所屬分類: 數據庫