MongoDB學習筆記(一)

來源:互聯網
上載者:User

標籤:

    最近有些時間,就抽空研究了一下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學習筆記(一)

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.