最近有些時間,就抽空研究了一下MongoDB,我之前常用關係型數據庫,如Oracle、MySQL,對MongoDB只是有些很膚淺的瞭解,最近下決心要好好研究一下,主要的參考書有兩本:《MongoDB 大數據處理權威指南(第二版)》、《MongoDB權威指南(初版)》,後者的版本比較舊,但基本還能夠用,基本的操做方式基本上差很少。我主要參考的是第一個本書,相對來講,第一本書比較簡單,但入門比較容易,還帶有PHP和Python的操做MongoDB的指南。javascript
一、安裝:MongoDB的安裝比較簡單,主站是www.mongodb.org,既有32位的版本,也有64位的版本,儘可能使用64位的版本。java
Windows環境下,能夠下載對應的安裝包,安裝便可linux
Linux能夠下載壓縮包,若是使用Ubuntu或者Fedora的話,還能夠經過在線檔案庫下載安裝,這樣能夠安裝到最新版本,具體安裝內容能夠參考https://docs.mongodb.org/manual/administration/install-on-linux/,這是mongoDB的官方文檔,若是有什麼問題,能夠到這裏查看一下,比較權威,內容也比較全。sql
我安裝和測試的環境以下mongodb
Windows 10 專業版shell
MongoDB 3.0.6版,安裝路徑爲D:\Program Files\MongoDB數據庫
爲方便使用mongoDB,將其命令目錄加入到環境變量Path裏,默認命令保存在D:\Program Files\MongoDB\Server\3.0\bin編程
二、MongoDB相對於Oracle、Mysql來講,結構上要簡單不少,同Oracle同樣,其一個實例能夠有多個數據庫,數據庫裏面能夠任意多個Collection,Collection相似於Oracle中的表概念,可是有本質的不容,Collection中的每一行保存的是鍵值對,叫Document,這也是mongoDB叫面向文檔的數據的一個緣由,若是對Json熟悉,理解這個也很是快,鍵很容易理解,能夠理解爲表中的列名,可是其值就比較特別了,能夠是數組,也能夠是鍵值對,而且Collection中的鍵很是自由,其下的Documnet能夠擁有不一樣的鍵,簡單來講,Documnet雖然屬於一個Collection,可是其鍵值對是沒有限制的,想怎麼樣,就怎麼樣。這種存儲方式,既有其優點,也有其劣勢。數組
優點:(相對關係型數據庫來講)性能
1)因爲存儲方式簡單,CUID的速度是很是快的,有這麼一句話:mongoDB若是查詢超過了1秒鐘,必然是出了問題
2)同一Collection下的Document之間沒什麼硬性約束,不一樣的Collection之間也沒有什麼約束,因此沒有關係型數據庫的完整性要求,這一點對於複製、分片是很是重要的。
3)複製、分片相對關係型數據庫來講,要容易的多,能夠經過橫向擴展來提高系統性能。
劣勢:(相對於關係型數據庫來講)
1)因爲沒有完整性約束,因此數據的規範性較爲困難,須要良好的編程紀律和查錯手段來約束
2)缺少對事務的支持,不適合應用到財務系統
3)缺少Collection聯查功能(也許未來會有),不少關係型數據庫須要的操做會很不方便,生成報表須要使用MapReduce才能夠。
總之,MongoDB的性能、擴展、複製、分片有獨特的優點,因此其不太適合於企業應用程序開發,可是很是適合互聯網、雲計算相關應用的開發,因此須要選擇適合的範圍用好它。
三、簡單操做
1)啓動
從命令行啓動mongoDB的命令是mongod,須要指定端口和數據庫數據路徑,在本機創建了數據庫目錄d:\mongodb_data\db1,端口爲27017
mongod --dbpath d:\mongodb_data\db1 --port 27017
2)鏈接
mongodDB提供了一個命令行接口mongo,這是一個Javascript的終端,能夠經過javascript腳原本操做數據庫
D:\>mongo 192.168.1.223:27017
MongoDB shell version: 3.0.6
connecting to: 192.168.1.223:27017/test
>
(192.168.1.223爲本機ip,若是鏈接遠程mongoDB,須要修改IP地址)
3)選擇數據庫
默認是鏈接到test數據庫,咱們建立一個新數據庫,如shiyq,以下
> use shiyq
(須要注意,use是切換數據庫的命令,若是沒有這個數據庫,系統會默認建立一個,並且數據庫名是區分大小寫的,因此用這個命令要細心一點)
> use shiyq
switched to db shiyq
> db
shiyq
> show dbs
local 0.078GB
test 0.078GB
testdb 0.078GB
> show collections;
>
能夠看出db命令是顯示當前數據庫,show dbs是顯示本實例中有哪些數據庫,由於shiyq是新數據庫,沒有內容,因此沒有顯示出來,show collections顯示本數據庫中的Collection名稱,目前尚未,因此沒有顯示。
4)建立Document
> db.students.insert({name:'王強',code:'s101-1',age:15});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:'劉歡',code:'s101-2',age:18});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:'趙成',code:'s101-3',age:17});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:'趙成',code:'s101-4',age:19});
WriteResult({ "nInserted" : 1 })
> db.students.insert({name:'趙成',code:'s101-5',age:19});
WriteResult({ "nInserted" : 1 })
collection名稱是students,能夠看到collection是不須要建立的,只要建立其下的document就能夠了;
> db.students.find()
{ "_id" : ObjectId("560b95bd3bd6389af11ee3d0"), "name" : "王強", "code" : "s101-1", "age" : 15 }
{ "_id" : ObjectId("560b961c3bd6389af11ee3d1"), "name" : "劉歡", "code" : "s101-2", "age" : 18 }
{ "_id" : ObjectId("560b96353bd6389af11ee3d2"), "name" : "趙成", "code" : "s101-3", "age" : 17 }
{ "_id" : ObjectId("560b963c3bd6389af11ee3d3"), "name" : "趙成", "code" : "s101-4", "age" : 19 }
{ "_id" : ObjectId("560b96413bd6389af11ee3d4"), "name" : "趙成", "code" : "s101-5", "age" : 19 }
能夠看出已經插入的數據,須要注意每個Document都有一個_id字段,這個至關於Collection的主鍵,這個鍵值也能夠手工指定,若是是系統指定,能夠保證在複製、分片中沒有衝突。
若是使用NodeJS,或者對Javascript比較熟悉,上面的內容也很是容易理解。
5)更新
語法:db.collection.update(criteria,objNew,options)
criteria是過濾條件,objNew是新的內容,options={upsert:true,multi:true},upsert=true,若是存在更新,不然建立,multi=true,若是多條數據符合,則所有更新,默認只更新第一條(須要注意,若是不指定鍵,沒法使用multi=true),須要注意的是這裏的objNew會徹底替代原始內容,若是要修改單個鍵值,不能用這個方法。
> db.students.update({name:'王強'},{grade:1});
WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 })
> db.students.find() );
{ "_id" : ObjectId("560b95bd3bd6389af11ee3d0"), "grade" : 1 }
6)刪除:
> db.students.remove({grade:1});
WriteResult({ "nRemoved" : 1 })
其餘的操做還有不少,好比
db.collection.save(),有_id更新,沒有則新增
$inc 增長值
$set 修改單個鍵值
$unset 刪除鍵值
$push 向數組鍵中增長值
$pull 從數組鍵中刪除全部值
$pullAll 從數組中刪除多個值
$pop 刪除數組中最後一個值
上述$的同一語法爲db.collection.update(criteria,{$set:{Author:'shiyq'});