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中
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 }
下一節:配置MongoDB服務
參考連接:http://docs.mongodb.org/manual/