標籤:
最近有些時間,就抽空研究了一下MongoDB,我以前經常使用關係型資料庫,如Oracle、MySQL,對MongoDB只是有些很膚淺的瞭解,最近下決心要好好研究一下,主要的參考書有兩本:《MongoDB 大資料處理權威指南(第二版)》、《MongoDB權威指南(第一版)》,後者的版本比較舊,但基本還可以用,基本的操作方式基本上差不多。我主要參考的是第一個本書,相對來說,第一本書比較簡單,但入門比較容易,還帶有PHP和Python的操作MongoDB的指南。
1、安裝:MongoDB的安裝比較簡單,主站是www.mongodb.org,既有32位的版本,也有64位的版本,盡量使用64位的版本。
Windows環境下,可以下載對應的安裝包,安裝即可
Linux可以下載壓縮包,如果使用Ubuntu或者Fedora的話,還可以通過線上檔案庫下載安裝,這樣可以安裝到最新版本,具體安裝內容可以參考https://docs.mongodb.org/manual/administration/install-on-linux/,這是mongoDB的官方文檔,如果有什麼問題,可以到這裡查看一下,比較權威,內容也比較全。
我安裝和測試的環境如下
Windows 10 專業版
MongoDB 3.0.6版,安裝路徑為D:\Program Files\MongoDB
為方便使用mongoDB,將其命令目錄加入到環境變數Path裡,預設命令儲存在D:\Program Files\MongoDB\Server\3.0\bin
2、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的效能、擴充、複製、分區有獨特的優勢,所以其不太適合於公司專屬應用程式程式開發,但是非常適合互連網、雲端運算相關應用的開發,所以需要選擇適合的範圍用好它。
3、簡單操作
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‘});
MongoDB學習筆記(一)