文章來源:http://www.runoob.com/mongodb/mongodb-tutorial.htmlphp
NoSQL 簡介
NoSQL(NoSQL = Not Only SQL ),意即"不只僅是SQL"。html
在現代的計算系統上天天網絡上都會產生龐大的數據量。前端
這些數據有很大一部分是由關係數據庫管理系統(RDMBSs)來處理。 1970年 E.F.Codd's提出的關係模型的論文 "A relational model of data for large shared data banks",這使得數據建模和應用程序編程更加簡單。java
經過應用實踐證實,關係模型是很是適合於客戶服務器編程,遠遠超出預期的利益,今天它是結構化數據存儲在網絡和商務應用的主導技術。node
NoSQL 是一項全新的數據庫革命性運動,早期就有人提出,發展至2009年趨勢愈加高漲。NoSQL的擁護者們提倡運用非關係型的數據存儲,相對於鋪天蓋地的關係型數據庫運用,這一律念無疑是一種全新的思惟的注入。python
事務在英文中是transaction,和現實世界中的交易很相似,它有以下四個特性:mysql
一、A (Atomicity) 原子性linux
原子性很容易理解,也就是說事務裏的全部操做要麼所有作完,要麼都不作,事務成功的條件是事務裏的全部操做都成功,只要有一個操做失敗,整個事務就失敗,須要回滾。git
好比銀行轉帳,從A帳戶轉100元至B帳戶,分爲兩個步驟:1)從A帳戶取100元;2)存入100元至B帳戶。這兩步要麼一塊兒完成,要麼一塊兒不完成,若是隻完成第一步,第二步失敗,錢會莫名其妙少了100元。github
二、C (Consistency) 一致性
一致性也比較容易理解,也就是說數據庫要一直處於一致的狀態,事務的運行不會改變數據庫本來的一致性約束。
例如現有完整性約束a+b=10,若是一個事務改變了a,那麼必須得改變b,使得事務結束後依然知足a+b=10,不然事務失敗。
三、I (Isolation) 獨立性
所謂的獨立性是指併發的事務之間不會互相影響,若是一個事務要訪問的數據正在被另一個事務修改,只要另一個事務未提交,它所訪問的數據就不受未提交事務的影響。
好比現有有個交易是從A帳戶轉100元至B帳戶,在這個交易還未完成的狀況下,若是此時B查詢本身的帳戶,是看不到新增長的100元的。
四、D (Durability) 持久性
持久性是指一旦事務提交後,它所作的修改將會永久的保存在數據庫上,即便出現宕機也不會丟失。
分佈式系統(distributed system)由多臺計算機和通訊的軟件組件經過計算機網絡鏈接(本地網絡或廣域網)組成。
分佈式系統是創建在網絡之上的軟件系統。正是由於軟件的特性,因此分佈式系統具備高度的內聚性和透明性。
所以,網絡和分佈式系統之間的區別更多的在於高層軟件(特別是操做系統),而不是硬件。
分佈式系統能夠應用在在不一樣的平臺上如:Pc、工做站、局域網和廣域網上等。
可靠性(容錯) :
分佈式計算系統中的一個重要的優勢是可靠性。一臺服務器的系統崩潰並不影響到其他的服務器。
可擴展性:
在分佈式計算系統能夠根據須要增長更多的機器。
資源共享:
共享數據是必不可少的應用,如銀行,預訂系統。
靈活性:
因爲該系統是很是靈活的,它很容易安裝,實施和調試新的服務。
更快的速度:
分佈式計算系統能夠有多臺計算機的計算能力,使得它比其餘系統有更快的處理速度。
開放系統:
因爲它是開放的系統,本地或者遠程均可以訪問到該服務。
更高的性能:
相較於集中式計算機網絡集羣能夠提供更高的性能(及更好的性價比)。
故障排除:
故障排除和診斷問題。
軟件:
更少的軟件支持是分佈式計算系統的主要缺點。
網絡:
網絡基礎設施的問題,包括:傳輸問題,高負載,信息丟失等。
安全性:
開發系統的特性讓分佈式計算系統存在着數據的安全性和共享的風險等問題。
NoSQL,指的是非關係型的數據庫。NoSQL有時也稱做Not Only SQL的縮寫,是對不一樣於傳統的關係型數據庫的數據庫管理系統的統稱。
NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook天天爲他們的用戶收集萬億比特的數據)。這些類型的數據存儲不須要固定的模式,無需多餘操做就能夠橫向擴展。
今天咱們能夠經過第三方平臺(如:Google,Facebook等)能夠很容易的訪問和抓取數據。用戶的我的信息,社交網絡,地理位置,用戶生成的數據和用戶操做日誌已經成倍的增長。咱們若是要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL數據庫的發展也卻能很好的處理這些大的數據。

社會化關係網:
Each record: UserID1, UserID2
Separate records: UserID, first_name,last_name, age, gender,...
Task: Find all friends of friends of friends of ... friends of a given user.
Wikipedia 頁面 :
Large collection of documents
Combination of structured and unstructured data
Task: Retrieve all pages regarding athletics of Summer Olympic before 1950.
RDBMS
- 高度組織化結構化數據
- 結構化查詢語言(SQL) (SQL)
- 數據和關係都存儲在單獨的表中。
- 數據操縱語言,數據定義語言
- 嚴格的一致性
- 基礎事務
NoSQL
- 表明着不只僅是SQL
- 沒有聲明性查詢語言
- 沒有預約義的模式
-鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理
- 高性能,高可用性和可伸縮性
NoSQL一詞最先出現於1998年,是Carlo Strozzi開發的一個輕量、開源、不提供SQL功能的關係數據庫。
2009年,Last.fm的Johan Oskarsson發起了一次關於分佈式開源數據庫的討論[2],來自Rackspace的Eric Evans再次提出了NoSQL的概念,這時的NoSQL主要指非關係型、分佈式、不提供ACID的數據庫設計模式。
2009年在亞特蘭大舉行的"no:sql(east)"討論會是一個里程碑,其口號是"select fun, profit from real_world where relational=false;"。所以,對NoSQL最廣泛的解釋是"非關聯型的",強調Key-Value Stores和文檔數據庫的優勢,而不是單純的反對RDBMS。
在計算機科學中, CAP定理(CAP theorem), 又被稱做 布魯爾定理(Brewer's theorem), 它指出對於一個分佈式計算系統來講,不可能同時知足如下三點:
- 一致性(Consistency) (全部節點在同一時間具備相同的數據)
- 可用性(Availability) (保證每一個請求無論成功或者失敗都有響應)
- 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運做)
CAP理論的核心是:一個分佈式系統不可能同時很好的知足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的知足兩個。
所以,根據 CAP 原理將 NoSQL 數據庫分紅了知足 CA 原則、知足 CP 原則和知足 AP 原則三 大類:
- CA - 單點集羣,知足一致性,可用性的系統,一般在可擴展性上不太強大。
- CP - 知足一致性,分區容忍性的系統,一般性能不是特別高。
- AP - 知足可用性,分區容忍性的系統,一般可能對一致性要求低一些。
優勢:
- - 高可擴展性
- - 分佈式計算
- - 低成本
- - 架構的靈活性,半結構化數據
- - 沒有複雜的關係
缺點:
- - 沒有標準化
- - 有限的查詢功能(到目前爲止)
- - 最終一致是不直觀的程序
BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定義。
CAP理論的核心是:一個分佈式系統不可能同時很好的知足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的知足兩個。
BASE是NoSQL數據庫一般對可用性及一致性的弱要求原則:
- Basically Availble --基本可用
- Soft-state --軟狀態/柔性事務。 "Soft state" 能夠理解爲"無鏈接"的, 而 "Hard state" 是"面向鏈接"的
- Eventual Consistency --最終一致性 最終一致性, 也是是 ACID 的最終目的。
ACID |
BASE |
原子性(Atomicity) |
基本可用(Basically Available) |
一致性(Consistency) |
軟狀態/柔性事務(Soft state) |
隔離性(Isolation) |
最終一致性 (Eventual consistency) |
持久性 (Durable) |
|
類型 |
部分表明 |
特色 |
列存儲 |
Hbase Cassandra Hypertable |
顧名思義,是按列存儲數據的。最大的特色是方便存儲結構化和半結構化數據,方便作數據壓縮,對針對某一列或者某幾列的查詢有很是大的IO優點。 |
文檔存儲 |
MongoDB CouchDB |
文檔存儲通常用相似json的格式存儲,存儲的內容是文檔型的。這樣也就有有機會對某些字段創建索引,實現關係數據庫的某些功能。 |
key-value存儲 |
Tokyo Cabinet / Tyrant Berkeley DB MemcacheDB Redis |
能夠經過key快速查詢到其value。通常來講,存儲無論value的格式,照單全收。(Redis包含了其餘功能) |
圖存儲 |
Neo4J FlockDB |
圖形關係的最佳存儲。使用傳統關係數據庫來解決的話性能低下,並且設計使用不方便。 |
對象存儲 |
db4o Versant |
經過相似面嚮對象語言的語法操做數據庫,經過對象的方式存取數據。 |
xml數據庫 |
Berkeley DB XML BaseX |
高效的存儲XML數據,並支持XML的內部查詢語法,好比XQuery,Xpath。 |
什麼是MongoDB ?
MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。
在高負載的狀況下,添加更多的節點,能夠保證服務器性能。
MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。

主要特色
- MongoDB的提供了一個面向文檔存儲,操做起來比較簡單和容易。
- 你能夠在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
- 你能夠經過本地或者網絡建立數據鏡像,這使得MongoDB有更強的擴展性。
- 若是負載的增長(須要更多的存儲空間和更強的處理能力) ,它能夠分佈在計算機網絡中的其餘節點上這就是所謂的分片。
- Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- MongoDb 使用update()命令能夠實現替換完成的文檔(數據)或者一些指定的數據字段 。
- Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操做。
- Map和Reduce。Map函數調用emit(key,value)遍歷集合中全部的記錄,將key與value傳給Reduce函數進行處理。
- Map函數和Reduce函數是使用Javascript編寫的,並能夠經過db.runCommand或mapreduce命令來執行MapReduce操做。
- GridFS是MongoDB中的一個內置功能,能夠用於存放大量小文件。
- MongoDB容許在服務端執行腳本,能夠用Javascript編寫某個函數,直接在服務端執行,也能夠把函數的定義存儲在服務端,下次直接調用便可。
- MongoDB支持各類編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
- MongoDB安裝簡單。
歷史
- 2007年10月,MongoDB由10gen團隊所發展。2009年2月首度推出。
- 2012年05月23日,MongoDB2.1 開發分支發佈了! 該版本採用全新架構,包含諸多加強。
- 2012年06月06日,MongoDB 2.0.6 發佈,分佈式文檔數據庫。
- 2013年04月23日,MongoDB 2.4.3 發佈,此版本包括了一些性能優化,功能加強以及bug修復。
- 2013年08月20日,MongoDB 2.4.6 發佈。
- 2013年11月01日,MongoDB 2.4.8 發佈。
- ……
MongoDB 下載
你能夠在mongodb官網下載該安裝包,地址爲:https://www.mongodb.com/download-center#community。MonggoDB支持如下平臺:
- OS X 32-bit
- OS X 64-bit
- Linux 32-bit
- Linux 64-bit
- Windows 32-bit
- Windows 64-bit
- Solaris i86pc
- Solaris 64
語言支持
MongoDB有官方的驅動以下:
MongoDB 工具
有幾種可用於MongoDB的管理工具。
監控
MongoDB提供了網絡和系統監控工具Munin,它做爲一個插件應用於MongoDB中。
Gangila是MongoDB高性能的系統監視的工具,它做爲一個插件應用於MongoDB中。
基於圖形界面的開源工具 Cacti, 用於查看CPU負載, 網絡帶寬利用率,它也提供了一個應用於監控 MongoDB 的插件。
GUI
- Fang of Mongo – 網頁式,由Django和jQuery所構成。
- Futon4Mongo – 一個CouchDB Futon web的mongodb山寨版。
- Mongo3 – Ruby寫成。
- MongoHub – 適用於OSX的應用程序。
- Opricot – 一個基於瀏覽器的MongoDB控制檯, 由PHP撰寫而成。
- Database Master — Windows的mongodb管理工具
- RockMongo — 最好的PHP語言的MongoDB管理工具,輕量級, 支持多國語言.
MongoDB 應用案例
下面列舉一些公司MongoDB的實際應用:
- Craiglist上使用MongoDB的存檔數十億條記錄。
- FourSquare,基於位置的社交網站,在Amazon EC2的服務器上使用MongoDB分享數據。
- Shutterfly,以互聯網爲基礎的社會和我的出版服務,使用MongoDB的各類持久性數據存儲的要求。
- bit.ly, 一個基於Web的網址縮短服務,使用MongoDB的存儲本身的數據。
- spike.com,一個MTV網絡的聯營公司, spike.com使用MongoDB的。
- Intuit公司,一個爲小企業和我的的軟件和服務提供商,爲小型企業使用MongoDB的跟蹤用戶的數據。
- sourceforge.net,資源網站查找,建立和發佈開源軟件免費,使用MongoDB的後端存儲。
- etsy.com ,一個購買和出售手工製做物品網站,使用MongoDB。
- 紐約時報,領先的在線新聞門戶網站之一,使用MongoDB。
- CERN,著名的粒子物理研究所,歐洲核子研究中心大型強子對撞機的數據使用MongoDB。
什麼是MongoDB ?
MongoDB 是由C++語言編寫的,是一個基於分佈式文件存儲的開源數據庫系統。
在高負載的狀況下,添加更多的節點,能夠保證服務器性能。
MongoDB 旨在爲WEB應用提供可擴展的高性能數據存儲解決方案。
MongoDB 將數據存儲爲一個文檔,數據結構由鍵值(key=>value)對組成。MongoDB 文檔相似於 JSON 對象。字段值能夠包含其餘文檔,數組及文檔數組。

主要特色
- MongoDB的提供了一個面向文檔存儲,操做起來比較簡單和容易。
- 你能夠在MongoDB記錄中設置任何屬性的索引 (如:FirstName="Sameer",Address="8 Gandhi Road")來實現更快的排序。
- 你能夠經過本地或者網絡建立數據鏡像,這使得MongoDB有更強的擴展性。
- 若是負載的增長(須要更多的存儲空間和更強的處理能力) ,它能夠分佈在計算機網絡中的其餘節點上這就是所謂的分片。
- Mongo支持豐富的查詢表達式。查詢指令使用JSON形式的標記,可輕易查詢文檔中內嵌的對象及數組。
- MongoDb 使用update()命令能夠實現替換完成的文檔(數據)或者一些指定的數據字段 。
- Mongodb中的Map/reduce主要是用來對數據進行批量處理和聚合操做。
- Map和Reduce。Map函數調用emit(key,value)遍歷集合中全部的記錄,將key與value傳給Reduce函數進行處理。
- Map函數和Reduce函數是使用Javascript編寫的,並能夠經過db.runCommand或mapreduce命令來執行MapReduce操做。
- GridFS是MongoDB中的一個內置功能,能夠用於存放大量小文件。
- MongoDB容許在服務端執行腳本,能夠用Javascript編寫某個函數,直接在服務端執行,也能夠把函數的定義存儲在服務端,下次直接調用便可。
- MongoDB支持各類編程語言:RUBY,PYTHON,JAVA,C++,PHP,C#等多種語言。
- MongoDB安裝簡單。
歷史
- 2007年10月,MongoDB由10gen團隊所發展。2009年2月首度推出。
- 2012年05月23日,MongoDB2.1 開發分支發佈了! 該版本採用全新架構,包含諸多加強。
- 2012年06月06日,MongoDB 2.0.6 發佈,分佈式文檔數據庫。
- 2013年04月23日,MongoDB 2.4.3 發佈,此版本包括了一些性能優化,功能加強以及bug修復。
- 2013年08月20日,MongoDB 2.4.6 發佈。
- 2013年11月01日,MongoDB 2.4.8 發佈。
- ……
MongoDB 下載
你能夠在mongodb官網下載該安裝包,地址爲:https://www.mongodb.com/download-center#community。MonggoDB支持如下平臺:
- OS X 32-bit
- OS X 64-bit
- Linux 32-bit
- Linux 64-bit
- Windows 32-bit
- Windows 64-bit
- Solaris i86pc
- Solaris 64
語言支持
MongoDB有官方的驅動以下:
MongoDB 工具
有幾種可用於MongoDB的管理工具。
監控
MongoDB提供了網絡和系統監控工具Munin,它做爲一個插件應用於MongoDB中。
Gangila是MongoDB高性能的系統監視的工具,它做爲一個插件應用於MongoDB中。
基於圖形界面的開源工具 Cacti, 用於查看CPU負載, 網絡帶寬利用率,它也提供了一個應用於監控 MongoDB 的插件。
GUI
- Fang of Mongo – 網頁式,由Django和jQuery所構成。
- Futon4Mongo – 一個CouchDB Futon web的mongodb山寨版。
- Mongo3 – Ruby寫成。
- MongoHub – 適用於OSX的應用程序。
- Opricot – 一個基於瀏覽器的MongoDB控制檯, 由PHP撰寫而成。
- Database Master — Windows的mongodb管理工具
- RockMongo — 最好的PHP語言的MongoDB管理工具,輕量級, 支持多國語言.
MongoDB 應用案例
下面列舉一些公司MongoDB的實際應用:
- Craiglist上使用MongoDB的存檔數十億條記錄。
- FourSquare,基於位置的社交網站,在Amazon EC2的服務器上使用MongoDB分享數據。
- Shutterfly,以互聯網爲基礎的社會和我的出版服務,使用MongoDB的各類持久性數據存儲的要求。
- bit.ly, 一個基於Web的網址縮短服務,使用MongoDB的存儲本身的數據。
- spike.com,一個MTV網絡的聯營公司, spike.com使用MongoDB的。
- Intuit公司,一個爲小企業和我的的軟件和服務提供商,爲小型企業使用MongoDB的跟蹤用戶的數據。
- sourceforge.net,資源網站查找,建立和發佈開源軟件免費,使用MongoDB的後端存儲。
- etsy.com ,一個購買和出售手工製做物品網站,使用MongoDB。
- 紐約時報,領先的在線新聞門戶網站之一,使用MongoDB。
- CERN,著名的粒子物理研究所,歐洲核子研究中心大型強子對撞機的數據使用MongoDB。
Linux平臺安裝MongoDB
MongoDB 提供了 linux 各發行版本 64 位的安裝包,你能夠在官網下載安裝包。
下載地址:https://www.mongodb.com/download-center#community

下載完安裝包,並解壓 tgz(如下演示的是 64 位 Linux上的安裝) 。
curl -O https://fastdl.mongodb.org/linux/mongodb-linux-x86_64-3.0.6.tgz # 下載 tar -zxvf mongodb-linux-x86_64-3.0.6.tgz # 解壓 mv mongodb-linux-x86_64-3.0.6/ /usr/local/mongodb # 將解壓包拷貝到指定目錄
MongoDB 的可執行文件位於 bin 目錄下,因此能夠將其添加到 PATH 路徑中:
export PATH=<mongodb-install-directory>/bin:$PATH
<mongodb-install-directory> 爲你 MongoDB 的安裝路徑。如本文的 /usr/local/mongodb 。
建立數據庫目錄
MongoDB的數據存儲在data目錄的db目錄下,可是這個目錄在安裝過程不會自動建立,因此你須要手動建立data目錄,並在data目錄中建立db目錄。
如下實例中咱們將data目錄建立於根目錄下(/)。
注意:/data/db 是 MongoDB 默認的啓動的數據庫路徑(--dbpath)。
mkdir -p /data/db
命令行中運行 MongoDB 服務
你能夠再命令行中執行mongo安裝目錄中的bin目錄執行mongod命令來啓動mongdb服務。
注意:若是你的數據庫目錄不是/data/db,能夠經過 --dbpath 來指定。
$ ./mongod 2015-09-25T16:39:50.549+0800 I JOURNAL [initandlisten] journal dir=/data/db/journal 2015-09-25T16:39:50.550+0800 I JOURNAL [initandlisten] recover : no journal files present, no recovery needed 2015-09-25T16:39:50.869+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 3.16 2015-09-25T16:39:51.206+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 3.52 2015-09-25T16:39:52.775+0800 I JOURNAL [initandlisten] preallocateIsFaster=true 7.7
MongoDB後臺管理 Shell
若是你須要進入MongoDB後臺管理,你須要先打開mongodb裝目錄的下的bin目錄,而後執行mongo命令文件。
MongoDB Shell是MongoDB自帶的交互式Javascript shell,用來對MongoDB進行操做和管理的交互式環境。
當你進入mongoDB後臺後,它默認會連接到 test 文檔(數據庫):
$ cd /usr/local/mongodb/bin $ ./mongo MongoDB shell version: 3.0.6 connecting to: test Welcome to the MongoDB shell. ……
因爲它是一個JavaScript shell,您能夠運行一些簡單的算術運算:
> 2+2 4 > 3+6 9
如今讓咱們插入一些簡單的數據,並對插入的數據進行檢索:
> db.runoob.insert({x:10}) WriteResult({ "nInserted" : 1 }) > db.runoob.find() { "_id" : ObjectId("5604ff74a274a611b0c990aa"), "x" : 10 } >
第一個命令將數字 10 插入到 runoob 集合的 x 字段中。
MongoDb web 用戶界面
MongoDB 提供了簡單的 HTTP 用戶界面。 若是你想啓用該功能,須要在啓動的時候指定參數 --rest 。
$ ./mongod --dbpath=/data/db --rest
MongoDB 的 Web 界面訪問端口比服務的端口多1000。
若是你的MongoDB運行端口使用默認的27017,你能夠在端口號爲28017訪問web用戶界面,即地址爲:http://localhost:28017。

Mac OSX 平臺安裝 MongoDB
MongoDB 提供了 OSX 平臺上 64 位的安裝包,你能夠在官網下載安裝包。
下載地址:https://www.mongodb.com/download-center#community

從 MongoDB 3.0 版本開始只支持 OS X 10.7 (Lion) 版本及更新版本的系統。
接下來咱們使用 curl 命令來下載安裝:
# 進入 /usr/local
cd /usr/local
# 下載
sudo curl -O https://fastdl.mongodb.org/osx/mongodb-osx-x86_64-3.4.2.tgz
# 解壓
sudo tar -zxvf mongodb-osx-x86_64-3.4.2.tgz
# 重命名爲 mongodb 目錄
sudo mv mongodb-osx-x86_64-3.4.2 mongodb
安裝完成後,咱們能夠把 MongoDB 的二進制命令文件目錄(安裝目錄/bin)添加到 PATH 路徑中:
export PATH=/usr/local/mongodb/bin:$PATH
使用 brew 安裝
此外你還可使用 OSX 的 brew 來安裝 mongodb:
sudo brew install mongodb
若是要安裝支持 TLS/SSL 命令以下:
sudo brew install mongodb --with-openssl
安裝最新開發版本:
sudo brew install mongodb --devel
運行 MongoDB
一、首先咱們建立一個數據庫存儲目錄 /data/db:
sudo mkdir -p /data/db
啓動 mongodb,默認數據庫目錄即爲 /data/db:
sudo mongod
# 若是沒有建立全局路徑 PATH,須要進入如下目錄
cd /usr/local/mongodb/bin
sudo ./mongod
再打開一個終端進入執行如下命令:
$ cd /usr/local/mongodb/bin
$ ./mongo
MongoDB shell version v3.4.2
connecting to: mongodb://127.0.0.1:27017
MongoDB server version: 3.4.2
Welcome to the MongoDB shell.
……
> 1 + 1
2
>
注意:若是你的數據庫目錄不是/data/db,能夠經過 --dbpath 來指定。
MongoDB 概念解析
無論咱們學習什麼數據庫都應該學習其中的基礎概念,在mongodb中基本的概念是文檔、集合、數據庫,下面咱們挨個介紹。
下表將幫助您更容易理解Mongo中的一些概念:
SQL術語/概念 |
MongoDB術語/概念 |
解釋/說明 |
database |
database |
數據庫 |
table |
collection |
數據庫表/集合 |
row |
document |
數據記錄行/文檔 |
column |
field |
數據字段/域 |
index |
index |
索引 |
table joins |
|
錶鏈接,MongoDB不支持 |
primary key |
primary key |
主鍵,MongoDB自動將_id字段設置爲主鍵 |
經過下圖實例,咱們也能夠更直觀的的瞭解Mongo中的一些概念:

數據庫
一個mongodb中能夠創建多個數據庫。
MongoDB的默認數據庫爲"db",該數據庫存儲在data目錄中。
MongoDB的單個實例能夠容納多個獨立的數據庫,每個都有本身的集合和權限,不一樣的數據庫也放置在不一樣的文件中。
"show dbs" 命令能夠顯示全部數據的列表。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > show dbs local 0.078GB test 0.078GB >
執行 "db" 命令能夠顯示當前數據庫對象或集合。
$ ./mongo MongoDB shell version: 3.0.6 connecting to: test > db test >
運行"use"命令,能夠鏈接到一個指定的數據庫。
> use local switched to db local > db local >
以上實例命令中,"local" 是你要連接的數據庫。
在下一個章節咱們將詳細講解MongoDB中命令的使用。
數據庫也經過名字來標識。數據庫名能夠是知足如下條件的任意UTF-8字符串。
- 不能是空字符串("")。
- 不得含有' '(空格)、.、$、/、\和\0 (空字符)。
- 應所有小寫。
- 最多64字節。
有一些數據庫名是保留的,能夠直接訪問這些有特殊做用的數據庫。
- admin: 從權限的角度來看,這是"root"數據庫。要是將一個用戶添加到這個數據庫,這個用戶自動繼承全部數據庫的權限。一些特定的服務器端命令也只能從這個數據庫運行,好比列出全部的數據庫或者關閉服務器。
- local: 這個數據永遠不會被複制,能夠用來存儲限於本地單臺服務器的任意集合
- config: 當Mongo用於分片設置時,config數據庫在內部使用,用於保存分片的相關信息。
文檔
文檔是一組鍵值(key-value)對(即BSON)。MongoDB 的文檔不須要設置相同的字段,而且相同的字段不須要相同的數據類型,這與關係型數據庫有很大的區別,也是 MongoDB 很是突出的特色。
一個簡單的文檔例子以下:
{"site":"www.runoob.com", "name":"菜鳥教程"}
下表列出了 RDBMS 與 MongoDB 對應的術語:
RDBMS |
MongoDB |
數據庫 |
數據庫 |
表格 |
集合 |
行 |
文檔 |
列 |
字段 |
表聯合 |
嵌入文檔 |
主鍵 |
主鍵 (MongoDB 提供了 key 爲 _id ) |
數據庫服務和客戶端 |
Mysqld/Oracle |
mongod |
mysql/sqlplus |
mongo |
須要注意的是:
- 文檔中的鍵/值對是有序的。
- 文檔中的值不只能夠是在雙引號裏面的字符串,還能夠是其餘幾種數據類型(甚至能夠是整個嵌入的文檔)。
- MongoDB區分類型和大小寫。
- MongoDB的文檔不能有重複的鍵。
- 文檔的鍵是字符串。除了少數例外狀況,鍵可使用任意UTF-8字符。
文檔鍵命名規範:
- 鍵不能含有\0 (空字符)。這個字符用來表示鍵的結尾。
- .和$有特別的意義,只有在特定環境下才能使用。
- 如下劃線"_"開頭的鍵是保留的(不是嚴格要求的)。
集合
集合就是 MongoDB 文檔組,相似於 RDBMS (關係數據庫管理系統:Relational Database Management System)中的表格。
集合存在於數據庫中,集合沒有固定的結構,這意味着你在對集合能夠插入不一樣格式和類型的數據,但一般狀況下咱們插入集合的數據都會有必定的關聯性。
好比,咱們能夠將如下不一樣數據結構的文檔插入到集合中:
{"site":"www.baidu.com"} {"site":"www.google.com","name":"Google"} {"site":"www.runoob.com","name":"菜鳥教程","num":5}
當第一個文檔插入時,集合就會被建立。
合法的集合名
- 集合名不能是空字符串""。
- 集合名不能含有\0字符(空字符),這個字符表示集合名的結尾。
- 集合名不能以"system."開頭,這是爲系統集合保留的前綴。
- 用戶建立的集合名字不能含有保留字符。有些驅動程序的確支持在集合名裏面包含,這是由於某些系統生成的集合中包含該字符。除非你要訪問這種系統建立的集合,不然千萬不要在名字裏出現$。
以下實例:
db.col.findOne()
capped collections
Capped collections 就是固定大小的collection。
它有很高的性能以及隊列過時的特性(過時按照插入的順序). 有點和 "RRD" 概念相似。
Capped collections是高性能自動的維護對象的插入順序。它很是適合相似記錄日誌的功能 和標準的collection不一樣,你必需要顯式的建立一個capped collection, 指定一個collection的大小,單位是字節。collection的數據存儲空間值提早分配的。
要注意的是指定的存儲大小包含了數據庫的頭信息。
db.createCollection("mycoll", {capped:true, size:100000})
- 在capped collection中,你能添加新的對象。
- 能進行更新,然而,對象不會增長存儲空間。若是增長,更新就會失敗 。
- 數據庫不容許進行刪除。使用drop()方法刪除collection全部的行。
- 注意: 刪除以後,你必須顯式的從新建立這個collection。
- 在32bit機器中,capped collection最大存儲爲1e9( 1X109)個字節。
元數據
數據庫的信息是存儲在集合中。它們使用了系統的命名空間:
dbname.system.*
在MongoDB數據庫中名字空間 <dbname>.system.* 是包含多種系統信息的特殊集合(Collection),以下:
集合命名空間 |
描述 |
dbname.system.namespaces |
列出全部名字空間。 |
dbname.system.indexes |
列出全部索引。 |
dbname.system.profile |
包含數據庫概要(profile)信息。 |
dbname.system.users |
列出全部可訪問數據庫的用戶。 |
dbname.local.sources |
包含複製對端(slave)的服務器信息和狀態。 |
對於修改系統集合中的對象有以下限制。
在{{system.indexes}}插入數據,能夠建立索引。但除此以外該表信息是不可變的(特殊的drop index命令將自動更新相關信息)。
{{system.users}}是可修改的。 {{system.profile}}是可刪除的。
MongoDB 數據類型
下表爲MongoDB中經常使用的幾種數據類型。
數據類型 |
描述 |
String |
字符串。存儲數據經常使用的數據類型。在 MongoDB 中,UTF-8 編碼的字符串纔是合法的。 |
Integer |
整型數值。用於存儲數值。根據你所採用的服務器,可分爲 32 位或 64 位。 |
Boolean |
布爾值。用於存儲布爾值(真/假)。 |
Double |
雙精度浮點值。用於存儲浮點值。 |
Min/Max keys |
將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。 |
Arrays |
用於將數組或列表或多個值存儲爲一個鍵。 |
Timestamp |
時間戳。記錄文檔修改或添加的具體時間。 |
Object |
用於內嵌文檔。 |
Null |
用於建立空值。 |
Symbol |
符號。該數據類型基本上等同於字符串類型,但不一樣的是,它通常用於採用特殊符號類型的語言。 |
Date |
日期時間。用 UNIX 時間格式來存儲當前日期或時間。你能夠指定本身的日期時間:建立 Date 對象,傳入年月日信息。 |
Object ID |
對象 ID。用於建立文檔的 ID。 |
Binary Data |
二進制數據。用於存儲二進制數據。 |
Code |
代碼類型。用於在文檔中存儲 JavaScript 代碼。 |
Regular expression |
正則表達式類型。用於存儲正則表達式。 |
MongoDB - 鏈接
在本教程咱們將討論 MongoDB 的不一樣鏈接方式。
啓動 MongoDB 服務
在前面的教程中,咱們已經討論了如何啓動 MongoDB 服務,你只須要在 MongoDB 安裝目錄的 bin 目錄下執行 mongod 便可。
執行啓動操做後,mongodb 在輸出一些必要信息後不會輸出任何信息,以後就等待鏈接的創建,當鏈接被創建後,就會開始打印日誌信息。
你可使用 MongoDB shell 來鏈接 MongoDB 服務器。你也可使用 PHP 來鏈接 MongoDB。本教程咱們會使用 MongoDB shell 來鏈接 Mongodb 服務,以後的章節咱們將會介紹如何經過php 來鏈接MongoDB服務。
標準 URI 鏈接語法:
mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]
-
mongodb:// 這是固定的格式,必需要指定。
-
username:password@ 可選項,若是設置,在鏈接數據庫服務器以後,驅動都會嘗試登錄這個數據庫
-
host1 必須的指定至少一個host, host1 是這個URI惟一要填寫的。它指定了要鏈接服務器的地址。若是要鏈接複製集,請指定多個主機地址。
-
portX 可選的指定端口,若是不填,默認爲27017
-
/database 若是指定username:password@,鏈接並驗證登錄指定數據庫。若不指定,默認打開 test 數據庫。
-
?options 是鏈接選項。若是不使用/database,則前面須要加上/。全部鏈接選項都是鍵值對name=value,鍵值對之間經過&或;(分號)隔開
標準的鏈接格式包含了多個選項(options),以下所示:
選項 |
描述 |
replicaSet=name |
驗證replica set的名稱。 Impliesconnect=replicaSet. |
slaveOk=true|false |
- true:在connect=direct模式下,驅動會鏈接第一臺機器,即便這臺服務器不是主。在connect=replicaSet模式下,驅動會發送全部的寫請求到主而且把讀取操做分佈在其餘從服務器。
- false: 在 connect=direct模式下,驅動會自動找尋主服務器. 在connect=replicaSet 模式下,驅動僅僅鏈接主服務器,而且全部的讀寫命令都鏈接到主服務器。
|
safe=true|false |
- true: 在執行更新操做以後,驅動都會發送getLastError命令來確保更新成功。(還要參考 wtimeoutMS).
false: 在每次更新以後,驅動不會發送getLastError來確保更新成功。 |
w=n |
驅動添加 { w : n } 到getLastError命令. 應用於safe=true。 |
wtimeoutMS=ms |
驅動添加 { wtimeout : ms } 到 getlasterror 命令. 應用於 safe=true. |
fsync=true|false |
- true: 驅動添加 { fsync : true } 到 getlasterror 命令.應用於 safe=true.
- false: 驅動不會添加到getLastError命令中。
|
journal=true|false |
若是設置爲 true, 同步到 journal (在提交到數據庫前寫入到實體中). 應用於 safe=true |
connectTimeoutMS=ms |
能夠打開鏈接的時間。 |
socketTimeoutMS=ms |
發送和接受sockets的時間。 |
實例
使用默認端口來鏈接 MongoDB 的服務。
mongodb://localhost
經過 shell 鏈接 MongoDB 服務:
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
...
這時候你返回查看運行 ./mongod 命令的窗口,能夠看到是從哪裏鏈接到MongoDB的服務器,您能夠看到以下信息:
……省略信息……
2015-09-25T17:22:27.336+0800 I CONTROL [initandlisten] allocator: tcmalloc
2015-09-25T17:22:27.336+0800 I CONTROL [initandlisten] options: { storage: { dbPath: "/data/db" } }
2015-09-25T17:22:27.350+0800 I NETWORK [initandlisten] waiting for connections on port 27017
2015-09-25T17:22:36.012+0800 I NETWORK [initandlisten] connection accepted from 127.0.0.1:37310 #1 (1 connection now open) # 該行代表一個來自本機的鏈接
……省略信息……
MongoDB 鏈接命令格式
使用用戶名和密碼鏈接到 MongoDB 服務器,你必須使用 'username:password@hostname/dbname' 格式,'username'爲用戶名,'password' 爲密碼。
使用用戶名和密碼鏈接登錄到默認數據庫:
$ ./mongo
MongoDB shell version: 3.0.6
connecting to: test
使用用戶 admin 使用密碼 123456 鏈接到本地的 MongoDB 服務上。輸出結果以下所示:
> mongodb://admin:123456@localhost/
...
使用用戶名和密碼鏈接登錄到指定數據庫,格式以下:
mongodb://admin:123456@localhost/test
更多鏈接實例
鏈接本地數據庫服務器,端口是默認的。
mongodb://localhost
使用用戶名fred,密碼foobar登陸localhost的admin數據庫。
mongodb://fred:foobar@localhost
使用用戶名fred,密碼foobar登陸localhost的baz數據庫。
mongodb://fred:foobar@localhost/baz
鏈接 replica pair, 服務器1爲example1.com服務器2爲example2。
mongodb://example1.com:27017,example2.com:27017
鏈接 replica set 三臺服務器 (端口 27017, 27018, 和27019):
mongodb://localhost,localhost:27018,localhost:27019
鏈接 replica set 三臺服務器, 寫入操做應用在主服務器 而且分佈查詢到從服務器。
mongodb://host1,host2,host3/?slaveOk=true
直接鏈接第一個服務器,不管是replica set一部分或者主服務器或者從服務器。
mongodb://host1,host2,host3/?connect=direct;slaveOk=true
當你的鏈接服務器有優先級,還須要列出全部服務器,你可使用上述鏈接方式。
安全模式鏈接到localhost:
mongodb://localhost/?safe=true
以安全模式鏈接到replica set,而且等待至少兩個複製服務器成功寫入,超時時間設置爲2秒。
mongodb://host1,host2,host3/?safe=true;w=2;wtimeoutMS=2000
MongoDB 建立數據庫
語法
MongoDB 建立數據庫的語法格式以下:
use DATABASE_NAME
若是數據庫不存在,則建立數據庫,不然切換到指定數據庫。
實例
如下實例咱們建立了數據庫 runoob:
> use runoob
switched to db runoob
> db
runoob
>
若是你想查看全部數據庫,可使用 show dbs 命令:
> show dbs
local 0.078GB
test 0.078GB
>
能夠看到,咱們剛建立的數據庫 runoob 並不在數據庫的列表中, 要顯示它,咱們須要向 runoob 數據庫插入一些數據。
> db.runoob.insert({"name":"菜鳥教程"})
WriteResult({ "nInserted" : 1 })
> show dbs
local 0.078GB
runoob 0.078GB
test 0.078GB
>
MongoDB 中默認的數據庫爲 test,若是你沒有建立新的數據庫,集合將存放在 test 數據庫中。
MongoDB 刪除數據庫
語法
MongoDB 刪除數據庫的語法格式以下:
db.dropDatabase()
刪除當前數據庫,默認爲 test,你可使用 db 命令查看當前數據庫名。
實例
如下實例咱們刪除了數據庫 runoob。
首先,查看全部數據庫:
> show dbs local 0.078GB runoob 0.078GB test 0.078GB
接下來咱們切換到數據庫 runoob:
> use runoob switched to db runoob >
執行刪除命令:
> db.dropDatabase() { "dropped" : "runoob", "ok" : 1 }
最後,咱們再經過 show dbs 命令數據庫是否刪除成功:
> show dbs local 0.078GB test 0.078GB >
刪除集合
集合刪除語法格式以下:
db.collection.drop()
如下實例刪除了 runoob 數據庫中的集合 site:
> use runoob switched to db runoob > show tables site > db.site.drop() true > show tables >
MongoDB 插入文檔
本章節中咱們將向你們介紹如何將數據插入到MongoDB的集合中。
文檔的數據結構和JSON基本同樣。
全部存儲在集合中的數據都是BSON格式。
BSON是一種類json的一種二進制形式的存儲格式,簡稱Binary JSON。
MongoDB 使用 insert() 或 save() 方法向集合中插入文檔,語法以下:
db.COLLECTION_NAME.insert(document)
實例
如下文檔能夠存儲在 MongoDB 的 runoob 數據庫 的 col 集合中:
>db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數據庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })
以上實例中 col 是咱們的集合名,若是該集合不在該數據庫中, MongoDB 會自動建立該集合並插入文檔。
查看已插入文檔:
> db.col.find() { "_id" : ObjectId("56064886ade2f21f36b03134"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } >
咱們也能夠將數據定義爲一個變量,以下所示:
> document=({title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數據庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 });
執行後顯示結果以下:
{ "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
執行插入操做:
> db.col.insert(document) WriteResult({ "nInserted" : 1 }) >
插入文檔你也可使用 db.col.save(document) 命令。若是不指定 _id 字段 save() 方法相似於 insert() 方法。若是指定 _id 字段,則會更新該 _id 的數據。
MongoDB $type 操做符
在本章節中,咱們將繼續討論MongoDB中條件操做符 $type。
$type操做符是基於BSON類型來檢索集合中匹配的數據類型,並返回結果。
MongoDB 中可使用的類型以下表所示:
類型 |
數字 |
備註 |
Double |
1 |
|
String |
2 |
|
Object |
3 |
|
Array |
4 |
|
Binary data |
5 |
|
Undefined |
6 |
已廢棄。 |
Object id |
7 |
|
Boolean |
8 |
|
Date |
9 |
|
Null |
10 |
|
Regular Expression |
11 |
|
JavaScript |
13 |
|
Symbol |
14 |
|
JavaScript (with scope) |
15 |
|
32-bit integer |
16 |
|
Timestamp |
17 |
|
64-bit integer |
18 |
|
Min key |
255 |
Query with -1. |
Max key |
127 |
|
咱們使用的數據庫名稱爲"runoob" 咱們的集合名稱爲"col",如下爲咱們插入的數據。
簡單的集合"col":
>db.col.insert({
title: 'PHP 教程',
description: 'PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['php'],
likes: 200
})
>db.col.insert({title: 'Java 教程',
description: 'Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['java'],
likes: 150
})
>db.col.insert({title: 'MongoDB 教程',
description: 'MongoDB 是一個 Nosql 數據庫',
by: '菜鳥教程',
url: 'http://www.runoob.com',
tags: ['mongodb'],
likes: 100
})
使用find()命令查看數據:
> db.col.find()
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
若是想獲取 "col" 集合中 title 爲 String 的數據,你可使用如下命令:
db.col.find({"title" : {$type : 2}})
輸出結果爲:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 }
{ "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 }
{ "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB Limit與Skip方法
MongoDB Limit() 方法
若是你須要在MongoDB中讀取指定數量的數據記錄,可使用MongoDB的Limit方法,limit()方法接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。
語法
limit()方法基本語法以下所示:
>db.COLLECTION_NAME.find().limit(NUMBER)
實例
集合 col 中的數據以下:
{ "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
以上實例爲顯示查詢文檔中的兩條記錄:
> db.col.find({},{"title":1,_id:0}).limit(2) { "title" : "PHP 教程" } { "title" : "Java 教程" } >
注:若是大家沒有指定limit()方法中的參數則顯示集合中的全部數據。
MongoDB Skip() 方法
咱們除了可使用limit()方法來讀取指定數量的數據外,還可使用skip()方法來跳過指定數量的數據,skip方法一樣接受一個數字參數做爲跳過的記錄條數。
語法
skip() 方法腳本語法格式以下:
>db.COLLECTION_NAME.find().limit(NUMBER).skip(NUMBER)
實例
以上實例只會顯示第二條文檔數據
>db.col.find({},{"title":1,_id:0}).limit(1).skip(1) { "title" : "Java 教程" } >
注:skip()方法默認參數爲 0 。
二少
272***623@qq.com
參考地址
3.2 版本後還有如下幾種語法可用於插入文檔:
# 插入單條數據 > var document = db.collection.insertOne({"a": 3}) > document { "acknowledged" : true, "insertedId" : ObjectId("571a218011a82a1d94c02333") } # 插入多條數據 > var res = db.collection.insertMany([{"b": 3}, {'c': 4}]) > res { "acknowledged" : true, "insertedIds" : [ ObjectId("571a22a911a82a1d94c02337"), ObjectId("571a22a911a82a1d94c02338") ] }
MongoDB 更新文檔
MongoDB 使用 update() 和 save() 方法來更新集合中的文檔。接下來讓咱們詳細來看下兩個函數的應用及其區別。
update() 方法
update() 方法用於更新已存在的文檔。語法格式以下:
db.collection.update( <query>, <update>, { upsert: <boolean>, multi: <boolean>, writeConcern: <document> } )
參數說明:
實例
咱們在集合 col 中插入以下數據:
>db.col.insert({ title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數據庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })
接着咱們經過 update() 方法來更新標題(title):
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}}) WriteResult({ "nMatched" : 1, "nUpserted" : 0, "nModified" : 1 }) # 輸出信息 > db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } >
能夠看到標題(title)由原來的 "MongoDB 教程" 更新爲了 "MongoDB"。
以上語句只會修改第一條發現的文檔,若是你要修改多條相同的文檔,則須要設置 multi 參數爲 true。
>db.col.update({'title':'MongoDB 教程'},{$set:{'title':'MongoDB'}},{multi:true})
save() 方法
save() 方法經過傳入的文檔來替換已有文檔。語法格式以下:
db.collection.save( <document>, { writeConcern: <document> } )
參數說明:
實例
如下實例中咱們替換了 _id 爲 56064f89ade2f21f36b03136 的文檔數據:
>db.col.save({ "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "Runoob", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 })
替換成功後,咱們能夠經過 find() 命令來查看替換後的數據
>db.col.find().pretty() { "_id" : ObjectId("56064f89ade2f21f36b03136"), "title" : "MongoDB", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "Runoob", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "NoSQL" ], "likes" : 110 } >
更多實例
只更新第一條記錄:
所有更新:
只添加第一條:
所有添加加進去:
所有更新:
只更新第一條記錄:
MongoDB 刪除文檔
在前面的幾個章節中咱們已經學習了MongoDB中如何爲集合添加數據和更新數據。在本章節中咱們將繼續學習MongoDB集合的刪除。
MongoDB remove()函數是用來移除集合中的數據。
MongoDB數據更新可使用update()函數。在執行remove()函數前先執行find()命令來判斷執行的條件是否正確,這是一個比較好的習慣。
語法
remove() 方法的基本語法格式以下所示:
db.collection.remove( <query>, <justOne> )
若是你的 MongoDB 是 2.6 版本之後的,語法格式以下:
db.collection.remove( <query>, { justOne: <boolean>, writeConcern: <document> } )
參數說明:
實例
如下文檔咱們執行兩次插入操做:
>db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數據庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 })
使用 find() 函數查詢數據:
> db.col.find() { "_id" : ObjectId("56066169ade2f21f36b03137"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 } { "_id" : ObjectId("5606616dade2f21f36b03138"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb", "database", "NoSQL" ], "likes" : 100 }
接下來咱們移除 title 爲 'MongoDB 教程' 的文檔:
>db.col.remove({'title':'MongoDB 教程'}) WriteResult({ "nRemoved" : 2 }) # 刪除了兩條數據 >db.col.find() …… # 沒有數據
若是你只想刪除第一條找到的記錄能夠設置 justOne 爲 1,以下所示:
>db.COLLECTION_NAME.remove(DELETION_CRITERIA,1)
若是你想刪除全部數據,可使用如下方式(相似常規 SQL 的 truncate 命令):
MongoDB 查詢文檔
MongoDB 查詢文檔使用 find() 方法。
find() 方法以非結構化的方式來顯示全部文檔。
語法
MongoDB 查詢數據的語法格式以下:
若是你須要以易讀的方式來讀取數據,可使用 pretty() 方法,語法格式以下:
pretty() 方法以格式化的方式來顯示全部文檔。
實例
如下實例咱們查詢了集合 col 中的數據:
除了 find() 方法以外,還有一個 findOne() 方法,它只返回一個文檔。
MongoDB 與 RDBMS Where 語句比較
若是你熟悉常規的 SQL 數據,經過下表能夠更好的理解 MongoDB 的條件語句查詢:
{<key>:<value>
}db.col.find({"by":"菜鳥教程"}).pretty()
where by = '菜鳥教程'
{<key>:{$lt:<value>}}
db.col.find({"likes":{$lt:50}}).pretty()
where likes < 50
{<key>:{$lte:<value>}}
db.col.find({"likes":{$lte:50}}).pretty()
where likes <= 50
{<key>:{$gt:<value>}}
db.col.find({"likes":{$gt:50}}).pretty()
where likes > 50
{<key>:{$gte:<value>}}
db.col.find({"likes":{$gte:50}}).pretty()
where likes >= 50
{<key>:{$ne:<value>}}
db.col.find({"likes":{$ne:50}}).pretty()
where likes != 50
MongoDB AND 條件
MongoDB 的 find() 方法能夠傳入多個鍵(key),每一個鍵(key)以逗號隔開,及常規 SQL 的 AND 條件。
語法格式以下:
實例
如下實例經過 by 和 title 鍵來查詢 菜鳥教程 中 MongoDB 教程 的數據
以上實例中相似於 WHERE 語句:WHERE by='菜鳥教程' AND title='MongoDB 教程'
MongoDB OR 條件
MongoDB OR 條件語句使用了關鍵字 $or,語法格式以下:
實例
如下實例中,咱們演示了查詢鍵 by 值爲 菜鳥教程 或鍵 title 值爲 MongoDB 教程 的文檔。
AND 和 OR 聯合使用
如下實例演示了 AND 和 OR 聯合使用,相似常規 SQL 語句爲: 'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'
MongoDB 條件操做符
描述
條件操做符用於比較兩個表達式並從mongoDB集合中獲取數據。
在本章節中,咱們將討論如何在MongoDB中使用條件操做符。
MongoDB中條件操做符有:
咱們使用的數據庫名稱爲"runoob" 咱們的集合名稱爲"col",如下爲咱們插入的數據。
爲了方便測試,咱們能夠先使用如下命令清空集合 "col" 的數據:
db.col.remove({})
插入如下數據
>db.col.insert({ title: 'PHP 教程', description: 'PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['php'], likes: 200 })
>db.col.insert({title: 'Java 教程', description: 'Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['java'], likes: 150 })
>db.col.insert({title: 'MongoDB 教程', description: 'MongoDB 是一個 Nosql 數據庫', by: '菜鳥教程', url: 'http://www.runoob.com', tags: ['mongodb'], likes: 100 })
使用find()命令查看數據:
> db.col.find() { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB (>) 大於操做符 - $gt
若是你想獲取 "col" 集合中 "likes" 大於 100 的數據,你可使用如下命令:
db.col.find({"likes" : {$gt : 100}})
相似於SQL語句:
Select * from col where likes > 100;
輸出結果:
> db.col.find({"likes" : {$gt : 100}}) { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } >
MongoDB(>=)大於等於操做符 - $gte
若是你想獲取"col"集合中 "likes" 大於等於 100 的數據,你可使用如下命令:
db.col.find({likes : {$gte : 100}})
相似於SQL語句:
Select * from col where likes >=100;
輸出結果:
> db.col.find({likes : {$gte : 100}}) { "_id" : ObjectId("56066542ade2f21f36b0313a"), "title" : "PHP 教程", "description" : "PHP 是一種建立動態交互性站點的強有力的服務器端腳本語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "php" ], "likes" : 200 } { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 } >
MongoDB (<) 小於操做符 - $lt
若是你想獲取"col"集合中 "likes" 小於 150 的數據,你可使用如下命令:
db.col.find({likes : {$lt : 150}})
相似於SQL語句:
Select * from col where likes < 150;
輸出結果:
> db.col.find({likes : {$lt : 150}}) { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB (<=) 小於操做符 - $lte
若是你想獲取"col"集合中 "likes" 小於等於 150 的數據,你可使用如下命令:
db.col.find({likes : {$lte : 150}})
相似於SQL語句:
Select * from col where likes <= 150;
輸出結果:
> db.col.find({likes : {$lte : 150}}) { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } { "_id" : ObjectId("5606654fade2f21f36b0313c"), "title" : "MongoDB 教程", "description" : "MongoDB 是一個 Nosql 數據庫", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "mongodb" ], "likes" : 100 }
MongoDB 使用 (<) 和 (>) 查詢 - $lt 和 $gt
若是你想獲取"col"集合中 "likes" 大於100,小於 200 的數據,你可使用如下命令:
db.col.find({likes : {$lt :200, $gt : 100}})
相似於SQL語句:
Select * from col where likes>100 AND likes<200;
輸出結果:
> db.col.find({likes : {$lt :200, $gt : 100}}) { "_id" : ObjectId("56066549ade2f21f36b0313b"), "title" : "Java 教程", "description" : "Java 是由Sun Microsystems公司於1995年5月推出的高級程序設計語言。", "by" : "菜鳥教程", "url" : "http://www.runoob.com", "tags" : [ "java" ], "likes" : 150 } >
筆記列表
Mrt.L
903***165@qq.com
一些簡寫說明: