Mongodb

文章來源: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

關係型數據庫遵循ACID規則

事務在英文中是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,指的是非關係型的數據庫。NoSQL有時也稱做Not Only SQL的縮寫,是對不一樣於傳統的關係型數據庫的數據庫管理系統的統稱。

NoSQL用於超大規模數據的存儲。(例如谷歌或Facebook天天爲他們的用戶收集萬億比特的數據)。這些類型的數據存儲不須要固定的模式,無需多餘操做就能夠橫向擴展。

爲何使用NoSQL ?

今天咱們能夠經過第三方平臺(如:Google,Facebook等)能夠很容易的訪問和抓取數據。用戶的我的信息,社交網絡,地理位置,用戶生成的數據和用戶操做日誌已經成倍的增長。咱們若是要對這些用戶數據進行挖掘,那SQL數據庫已經不適合這些應用了, NoSQL數據庫的發展也卻能很好的處理這些大的數據。

web-data-image

實例

社會化關係網:

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 vs NoSQL

RDBMS 
- 高度組織化結構化數據 
- 結構化查詢語言(SQL) (SQL) 
- 數據和關係都存儲在單獨的表中。 
- 數據操縱語言,數據定義語言 
- 嚴格的一致性
- 基礎事務

NoSQL 
- 表明着不只僅是SQL
- 沒有聲明性查詢語言
- 沒有預約義的模式
-鍵 - 值對存儲,列存儲,文檔存儲,圖形數據庫
- 最終一致性,而非ACID屬性
- 非結構化和不可預知的數據
- CAP定理 
- 高性能,高可用性和可伸縮性

bigdata 

NoSQL 簡史

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)

在計算機科學中, CAP定理(CAP theorem), 又被稱做 布魯爾定理(Brewer's theorem), 它指出對於一個分佈式計算系統來講,不可能同時知足如下三點:

  • 一致性(Consistency) (全部節點在同一時間具備相同的數據)
  • 可用性(Availability) (保證每一個請求無論成功或者失敗都有響應)
  • 分隔容忍(Partition tolerance) (系統中任意信息的丟失或失敗不會影響系統的繼續運做)

CAP理論的核心是:一個分佈式系統不可能同時很好的知足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的知足兩個。

所以,根據 CAP 原理將 NoSQL 數據庫分紅了知足 CA 原則、知足 CP 原則和知足 AP 原則三 大類:

  • CA - 單點集羣,知足一致性,可用性的系統,一般在可擴展性上不太強大。
  • CP - 知足一致性,分區容忍性的系統,一般性能不是特別高。
  • AP - 知足可用性,分區容忍性的系統,一般可能對一致性要求低一些。

cap-theoram-image 

NoSQL的優勢/缺點

優勢:

  • - 高可擴展性
  • - 分佈式計算
  • - 低成本
  • - 架構的靈活性,半結構化數據
  • - 沒有複雜的關係

缺點:

  • - 沒有標準化
  • - 有限的查詢功能(到目前爲止)
  • - 最終一致是不直觀的程序

 

BASE

BASE:Basically Available, Soft-state, Eventually Consistent。 由 Eric Brewer 定義。

CAP理論的核心是:一個分佈式系統不可能同時很好的知足一致性,可用性和分區容錯性這三個需求,最多隻能同時較好的知足兩個。

BASE是NoSQL數據庫一般對可用性及一致性的弱要求原則:

  • Basically Availble --基本可用
  • Soft-state --軟狀態/柔性事務。 "Soft state" 能夠理解爲"無鏈接"的, 而 "Hard state" 是"面向鏈接"的
  • Eventual Consistency --最終一致性 最終一致性, 也是是 ACID 的最終目的。

 

ACID vs BASE

ACID BASE
原子性(Atomicity) 基本可用(Basically Available)
一致性(Consistency) 軟狀態/柔性事務(Soft state)
隔離性(Isolation) 最終一致性 (Eventual consistency)
持久性 (Durable)  

 

NoSQL 數據庫分類

 

類型 部分表明

 

特色
列存儲

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

須要注意的是:

  1. 文檔中的鍵/值對是有序的。
  2. 文檔中的值不只能夠是在雙引號裏面的字符串,還能夠是其餘幾種數據類型(甚至能夠是整個嵌入的文檔)。
  3. MongoDB區分類型和大小寫。
  4. MongoDB的文檔不能有重複的鍵。
  5. 文檔的鍵是字符串。除了少數例外狀況,鍵可使用任意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 的數據。

 筆記列表

  1.    二少

      272***623@qq.com

       參考地址

    3.2 版本後還有如下幾種語法可用於插入文檔:

    •  db.collection.insertOne():向指定集合中插入一條文檔數據
    •  db.collection.insertMany():向指定集合中插入多條文檔數據
    #  插入單條數據 > 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> } )

    參數說明:

    • query : update的查詢條件,相似sql update查詢內where後面的。
    • update : update的對象和一些更新的操做符(如$,$inc...)等,也能夠理解爲sql update查詢內set後面的
    • upsert : 可選,這個參數的意思是,若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入。
    • multi : 可選,mongodb 默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。
    • writeConcern :可選,拋出異常的級別。

    實例

    咱們在集合 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> } )

    參數說明:

    • document : 文檔數據。
    • writeConcern :可選,拋出異常的級別。

    實例

    如下實例中咱們替換了 _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 } >

    更多實例

    只更新第一條記錄:

    db.col.update( { "count" : { $gt : 1 } } , { $set : { "test2" : "OK"} } );

    所有更新:

    db.col.update( { "count" : { $gt : 3 } } , { $set : { "test2" : "OK"} },false,true );

    只添加第一條:

    db.col.update( { "count" : { $gt : 4 } } , { $set : { "test5" : "OK"} },true,false );

    所有添加加進去:

    db.col.update( { "count" : { $gt : 5 } } , { $set : { "test5" : "OK"} },true,true );

    所有更新:

    db.col.update( { "count" : { $gt : 15 } } , { $inc : { "count" : 1} },false,true );

    只更新第一條記錄:

    db.col.update( { "count" : { $gt : 10 } } , { $inc : { "count" : 1} },false,false );
     

    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> } )

    參數說明:

    • query :(可選)刪除的文檔的條件。
    • justOne : (可選)若是設爲 true 或 1,則只刪除一個文檔。
    • writeConcern :(可選)拋出異常的級別。

    實例

    如下文檔咱們執行兩次插入操做:

    >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 命令):

    >db.col.remove({}) >db.col.find() >


    MongoDB 查詢文檔

    MongoDB 查詢文檔使用 find() 方法。

    find() 方法以非結構化的方式來顯示全部文檔。

    語法

    MongoDB 查詢數據的語法格式以下:

    db.collection.find(query, projection)
    • query :可選,使用查詢操做符指定查詢條件
    • projection :可選,使用投影操做符指定返回的鍵。查詢時返回文檔中全部鍵值, 只需省略該參數便可(默認省略)。

    若是你須要以易讀的方式來讀取數據,可使用 pretty() 方法,語法格式以下:

    >db.col.find().pretty()
    

    pretty() 方法以格式化的方式來顯示全部文檔。

    實例

    如下實例咱們查詢了集合 col 中的數據:

    > db.col.find().pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數據庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }
    

    除了 find() 方法以外,還有一個 findOne() 方法,它只返回一個文檔。


    MongoDB 與 RDBMS Where 語句比較

    若是你熟悉常規的 SQL 數據,經過下表能夠更好的理解 MongoDB 的條件語句查詢:

    操做 格式 範例 RDBMS中的相似語句
    等於 {<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 條件。

    語法格式以下:

    >db.col.find({key1:value1, key2:value2}).pretty()
    

    實例

    如下實例經過 by 和 title 鍵來查詢 菜鳥教程 中 MongoDB 教程 的數據

    > db.col.find({"by":"菜鳥教程", "title":"MongoDB 教程"}).pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數據庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }
    

    以上實例中相似於 WHERE 語句:WHERE by='菜鳥教程' AND title='MongoDB 教程'


    MongoDB OR 條件

    MongoDB OR 條件語句使用了關鍵字 $or,語法格式以下:

    >db.col.find(
       {
          $or: [
    	     {key1: value1}, {key2:value2}
          ]
       }
    ).pretty()
    

    實例

    如下實例中,咱們演示了查詢鍵 by 值爲 菜鳥教程 或鍵 title 值爲 MongoDB 教程 的文檔。

    >db.col.find({$or:[{"by":"菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數據庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }
    >
    

    AND 和 OR 聯合使用

    如下實例演示了 AND 和 OR 聯合使用,相似常規 SQL 語句爲: 'where likes>50 AND (by = '菜鳥教程' OR title = 'MongoDB 教程')'

    >db.col.find({"likes": {$gt:50}, $or: [{"by": "菜鳥教程"},{"title": "MongoDB 教程"}]}).pretty()
    {
            "_id" : ObjectId("56063f17ade2f21f36b03133"),
            "title" : "MongoDB 教程",
            "description" : "MongoDB 是一個 Nosql 數據庫",
            "by" : "菜鳥教程",
            "url" : "http://www.runoob.com",
            "tags" : [
                    "mongodb",
                    "database",
                    "NoSQL"
            ],
            "likes" : 100
    }

    MongoDB 條件操做符


    描述

    條件操做符用於比較兩個表達式並從mongoDB集合中獲取數據。

    在本章節中,咱們將討論如何在MongoDB中使用條件操做符。

    MongoDB中條件操做符有:

    • (>) 大於 - $gt
    • (<) 小於 - $lt
    • (>=) 大於等於 - $gte
    • (<= ) 小於等於 - $lte

    咱們使用的數據庫名稱爲"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 } >

     筆記列表

    1.    Mrt.L

        903***165@qq.com

      一些簡寫說明:

      $gt -------- greater than > $gte --------- gt equal >= $lt -------- less than < $lte --------- lt equal <= $ne ----------- not equal != $eq -------- equal =

 

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 }

 

MongoDB 操做符 - $type 實例

若是想獲取 "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 。

 筆記列表

  1.  

    db.col.find({},{"title":1,_id:0}).limit(2)

    補充說明:

    • 第一個 {} 放 where 條件,爲空表示返回集合中全部文檔。
    • 第二個 {} 指定那些列顯示和不顯示 (0表示不顯示 1表示顯示)。
     
  2.  

    想要讀取從 10 條記錄後 100 條記錄,至關於 sql 中limit (10,100)。

    > db.COLLECTION_NAME.find().skip(10).limit(100)

    以上實例在集合中跳過前面 10 條返回 100 條數據。

    skip 和 limit 結合就能實現分頁。

     
  3. 當查詢時同時使用sort,skip,limit,不管位置前後,最早執行順序 sort再skip再limit。

     

     

    MongoDB 排序


    MongoDB sort()方法

    在MongoDB中使用使用sort()方法對數據進行排序,sort()方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,其中 1 爲升序排列,而-1是用於降序排列。

    語法

    sort()方法基本語法以下所示:

    >db.COLLECTION_NAME.find().sort({KEY:1})
    

    實例

    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 }
    

    如下實例演示了 col 集合中的數據按字段 likes 的降序排列:

    >db.col.find({},{"title":1,_id:0}).sort({"likes":-1})
    { "title" : "PHP 教程" }
    { "title" : "Java 教程" }
    { "title" : "MongoDB 教程" }


    MongoDB 索引

    索引一般可以極大的提升查詢的效率,若是沒有索引,MongoDB在讀取數據時必須掃描集合中的每一個文件並選取那些符合查詢條件的記錄。

    這種掃描全集合的查詢效率是很是低的,特別在處理大量的數據時,查詢能夠要花費幾十秒甚至幾分鐘,這對網站的性能是很是致命的。

    索引是特殊的數據結構,索引存儲在一個易於遍歷讀取的數據集合中,索引是對數據庫表中一列或多列的值進行排序的一種結構


    ensureIndex() 方法

    MongoDB使用 ensureIndex() 方法來建立索引。

    語法

    ensureIndex()方法基本語法格式以下所示:

    >db.COLLECTION_NAME.ensureIndex({KEY:1})

    語法中 Key 值爲你要建立的索引字段,1爲指定按升序建立索引,若是你想按降序來建立索引指定爲-1便可。

    實例

    >db.col.ensureIndex({"title":1}) >

    ensureIndex() 方法中你也能夠設置使用多個字段建立索引(關係型數據庫中稱做複合索引)。

    >db.col.ensureIndex({"title":1,"description":-1}) >

    ensureIndex() 接收可選參數,可選參數列表以下:

    Parameter Type Description
    background Boolean 建索引過程會阻塞其它數據庫操做,background可指定之後臺方式建立索引,即增長 "background" 可選參數。 "background" 默認值爲false
    unique Boolean 創建的索引是否惟一。指定爲true建立惟一索引。默認值爲false.
    name string 索引的名稱。若是未指定,MongoDB的經過鏈接索引的字段名和排序順序生成一個索引名稱。
    dropDups Boolean 在創建惟一索引時是否刪除重複記錄,指定 true 建立惟一索引。默認值爲 false.
    sparse Boolean 對文檔中不存在的字段數據不啓用索引;這個參數須要特別注意,若是設置爲true的話,在索引字段中不會查詢出不包含對應字段的文檔.。默認值爲 false.
    expireAfterSeconds integer 指定一個以秒爲單位的數值,完成 TTL設定,設定集合的生存時間。
    v index version 索引的版本號。默認的索引版本取決於mongod建立索引時運行的版本。
    weights document 索引權重值,數值在 1 到 99,999 之間,表示該索引相對於其餘索引字段的得分權重。
    default_language string 對於文本索引,該參數決定了停用詞及詞幹和詞器的規則的列表。 默認爲英語
    language_override string 對於文本索引,該參數指定了包含在文檔中的字段名,語言覆蓋默認的language,默認值爲 language.

    實例

    在後臺建立索引:

    db.values.ensureIndex({open: 1, close: 1}, {background: true})

    經過在建立索引時加background:true 的選項,讓建立工做在後臺執行

    MongoDB 聚合

    MongoDB中聚合(aggregate)主要用於處理數據(諸如統計平均值,求和等),並返回計算後的數據結果。有點相似sql語句中的 count(*)。


    aggregate() 方法

    MongoDB中聚合的方法使用aggregate()。

    語法

    aggregate() 方法的基本語法格式以下所示:

    >db.COLLECTION_NAME.aggregate(AGGREGATE_OPERATION)

    實例

    集合中的數據以下:

    { _id: ObjectId(7df78ad8902c) title: 'MongoDB Overview', description: 'MongoDB is no sql database', by_user: 'runoob.com', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 100 }, { _id: ObjectId(7df78ad8902d) title: 'NoSQL Overview', description: 'No sql database is very fast', by_user: 'runoob.com', url: 'http://www.runoob.com', tags: ['mongodb', 'database', 'NoSQL'], likes: 10 }, { _id: ObjectId(7df78ad8902e) title: 'Neo4j Overview', description: 'Neo4j is no sql database', by_user: 'Neo4j', url: 'http://www.neo4j.com', tags: ['neo4j', 'database', 'NoSQL'], likes: 750 },

    如今咱們經過以上集合計算每一個做者所寫的文章數,使用aggregate()計算結果以下:

    > db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}]) { "result" : [ { "_id" : "runoob.com", "num_tutorial" : 2 }, { "_id" : "Neo4j", "num_tutorial" : 1 } ], "ok" : 1 } >

    以上實例相似sql語句: select by_user, count(*) from mycol group by by_user

    在上面的例子中,咱們經過字段by_user字段對數據進行分組,並計算by_user字段相同值的總和。

    下表展現了一些聚合的表達式:

    表達式 描述 實例
    $sum 計算總和。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : "$likes"}}}])
    $avg 計算平均值 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$avg : "$likes"}}}])
    $min 獲取集合中全部文檔對應值得最小值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$min : "$likes"}}}])
    $max 獲取集合中全部文檔對應值得最大值。 db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$max : "$likes"}}}])
    $push 在結果文檔中插入值到一個數組中。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$push: "$url"}}}])
    $addToSet 在結果文檔中插入值到一個數組中,但不建立副本。 db.mycol.aggregate([{$group : {_id : "$by_user", url : {$addToSet : "$url"}}}])
    $first 根據資源文檔的排序獲取第一個文檔數據。 db.mycol.aggregate([{$group : {_id : "$by_user", first_url : {$first : "$url"}}}])
    $last 根據資源文檔的排序獲取最後一個文檔數據 db.mycol.aggregate([{$group : {_id : "$by_user", last_url : {$last : "$url"}}}])

    管道的概念

    管道在Unix和Linux中通常用於將當前命令的輸出結果做爲下一個命令的參數。

    MongoDB的聚合管道將MongoDB文檔在一個管道處理完畢後將結果傳遞給下一個管道處理。管道操做是能夠重複的。

    表達式:處理輸入文檔並輸出。表達式是無狀態的,只能用於計算當前聚合管道的文檔,不能處理其它的文檔。

    這裏咱們介紹一下聚合框架中經常使用的幾個操做:

    • $project:修改輸入文檔的結構。能夠用來重命名、增長或刪除域,也能夠用於建立計算結果以及嵌套文檔。
    • $match:用於過濾數據,只輸出符合條件的文檔。$match使用MongoDB的標準查詢操做。
    • $limit:用來限制MongoDB聚合管道返回的文檔數。
    • $skip:在聚合管道中跳過指定數量的文檔,並返回餘下的文檔。
    • $unwind:將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。
    • $group:將集合中的文檔分組,可用於統計結果。
    • $sort:將輸入文檔排序後輸出。
    • $geoNear:輸出接近某一地理位置的有序文檔。

    管道操做符實例

    一、$project實例

     

    db.article.aggregate( { $project : { title : 1 , author : 1 , }} );

    這樣的話結果中就只還有_id,tilte和author三個字段了,默認狀況下_id字段是被包含的,若是要想不包含_id話能夠這樣:

    db.article.aggregate( { $project : { _id : 0 , title : 1 , author : 1 }});

    2.$match實例

    db.articles.aggregate( [ { $match : { score : { $gt : 70, $lte : 90 } } }, { $group: { _id: null, count: { $sum: 1 } } } ] );

    $match用於獲取分數大於70小於或等於90記錄,而後將符合條件的記錄送到下一階段$group管道操做符進行處理。

    3.$skip實例

    db.article.aggregate( { $skip : 5 });

    通過$skip管道操做符處理後,前五個文檔被"過濾"掉。

     筆記列表

    1.  

      db.mycol.aggregate([{$group : {_id : "$by_user", num_tutorial : {$sum : 1}}}])

      以上實例相似sql語句:

      select by_user as _id, count(*) as num_tutorial from mycol group by by_user
       
    2.  

      db.articles.aggregate({ $project : { title: 2, by_user: 1, } })

      這樣子也是可行的。也就是說非0也能夠進行表示顯示該字段,負數也能夠表示顯示該字段。

       

      MongoDB 複製(副本集)

      MongoDB複製是將數據同步在多個服務器的過程。

      複製提供了數據的冗餘備份,並在多個服務器上存儲數據副本,提升了數據的可用性, 並能夠保證數據的安全性。

      複製還容許您從硬件故障和服務中斷中恢復數據。


      什麼是複製?

      • 保障數據的安全性
      • 數據高可用性 (24*7)
      • 災難恢復
      • 無需停機維護(如備份,重建索引,壓縮)
      • 分佈式讀取數據

      MongoDB複製原理

      mongodb的複製至少須要兩個節點。其中一個是主節點,負責處理客戶端請求,其他的都是從節點,負責複製主節點上的數據。

      mongodb各個節點常見的搭配方式爲:一主一從、一主多從。

      主節點記錄在其上的全部操做oplog,從節點按期輪詢主節點獲取這些操做,而後對本身的數據副本執行這些操做,從而保證從節點的數據與主節點一致。

      MongoDB複製結構圖以下所示:

      MongoDB複製結構圖

      以上結構圖中,客戶端從主節點讀取數據,在客戶端寫入數據到主節點時, 主節點與從節點進行數據交互保障數據的一致性。

      副本集特徵:

      • N 個節點的集羣
      • 任何節點可做爲主節點
      • 全部寫入操做都在主節點上
      • 自動故障轉移
      • 自動恢復

      MongoDB副本集設置

      在本教程中咱們使用同一個MongoDB來作MongoDB主從的實驗, 操做步驟以下:

      一、關閉正在運行的MongoDB服務器。

      如今咱們經過指定 --replSet 選項來啓動mongoDB。--replSet 基本語法格式以下:

      mongod --port "PORT" --dbpath "YOUR_DB_DATA_PATH" --replSet "REPLICA_SET_INSTANCE_NAME"
      

      實例

      mongod --port 27017 --dbpath "D:\set up\mongodb\data" --replSet rs0
      

      以上實例會啓動一個名爲rs0的MongoDB實例,其端口號爲27017。

      啓動後打開命令提示框並鏈接上mongoDB服務。

      在Mongo客戶端使用命令rs.initiate()來啓動一個新的副本集。

      咱們可使用rs.conf()來查看副本集的配置

      查看副本集狀態使用 rs.status() 命令


      副本集添加成員

      添加副本集的成員,咱們須要使用多條服務器來啓動mongo服務。進入Mongo客戶端,並使用rs.add()方法來添加副本集的成員。

      語法

      rs.add() 命令基本語法格式以下:

      >rs.add(HOST_NAME:PORT)
      

      實例

      假設你已經啓動了一個名爲mongod1.net,端口號爲27017的Mongo服務。 在客戶端命令窗口使用rs.add() 命令將其添加到副本集中,命令以下所示:

      >rs.add("mongod1.net:27017")
      >
      

      MongoDB中你只能經過主節點將Mongo服務添加到副本集中, 判斷當前運行的Mongo服務是否爲主節點可使用命令db.isMaster() 。

      MongoDB的副本集與咱們常見的主從有所不一樣,主從在主機宕機後全部服務將中止,而副本集在主機宕機後,副本會接管主節點成爲主節點,不會出現宕機的狀況。

       

       

      MongoDB 分片


      分片

      在Mongodb裏面存在另外一種集羣,就是分片技術,能夠知足MongoDB數據量大量增加的需求。

      當MongoDB存儲海量的數據時,一臺機器可能不足以存儲數據,也可能不足以提供可接受的讀寫吞吐量。這時,咱們就能夠經過在多臺機器上分割數據,使得數據庫系統能存儲和處理更多的數據。


      爲何使用分片

      • 複製全部的寫入操做到主節點
      • 延遲的敏感數據會在主節點查詢
      • 單個副本集限制在12個節點
      • 當請求量巨大時會出現內存不足。
      • 本地磁盤不足
      • 垂直擴展價格昂貴

      MongoDB分片

      下圖展現了在MongoDB中使用分片集羣結構分佈:

      上圖中主要有以下所述三個主要組件:

      • Shard:

        用於存儲實際的數據塊,實際生產環境中一個shard server角色可由幾臺機器組個一個replica set承擔,防止主機單點故障

      • Config Server:

        mongod實例,存儲了整個 ClusterMetadata,其中包括 chunk信息。

      • Query Routers:

        前端路由,客戶端由此接入,且讓整個集羣看上去像單一數據庫,前端應用能夠透明使用。


      分片實例

      分片結構端口分佈以下:

      Shard Server 127020 Shard Server 227021 Shard Server 327022 Shard Server 427023 Config Server 27100 Route Process40000

      步驟一:啓動Shard Server

      [root@100 /]# mkdir -p /www/mongoDB/shard/s0 [root@100 /]# mkdir -p /www/mongoDB/shard/s1 [root@100 /]# mkdir -p /www/mongoDB/shard/s2 [root@100 /]# mkdir -p /www/mongoDB/shard/s3 [root@100 /]# mkdir -p /www/mongoDB/shard/log [root@100 /]# /usr/local/mongoDB/bin/mongod --port 27020 --dbpath=/www/mongoDB/shard/s0 --logpath=/www/mongoDB/shard/log/s0.log --logappend --fork .... [root@100 /]# /usr/local/mongoDB/bin/mongod --port 27023 --dbpath=/www/mongoDB/shard/s3 --logpath=/www/mongoDB/shard/log/s3.log --logappend --fork

      步驟二: 啓動Config Server

      [root@100 /]# mkdir -p /www/mongoDB/shard/config [root@100 /]# /usr/local/mongoDB/bin/mongod --port 27100 --dbpath=/www/mongoDB/shard/config --logpath=/www/mongoDB/shard/log/config.log --logappend --fork

      注意:這裏咱們徹底能夠像啓動普通mongodb服務同樣啓動,不須要添加—shardsvr和configsvr參數。由於這兩個參數的做用就是改變啓動端口的,因此咱們自行指定了端口就能夠。

      步驟三: 啓動Route Process

      /usr/local/mongoDB/bin/mongos --port 40000 --configdb localhost:27100 --fork --logpath=/www/mongoDB/shard/log/route.log --chunkSize 500

      mongos啓動參數中,chunkSize這一項是用來指定chunk的大小的,單位是MB,默認大小爲200MB.

      步驟四: 配置Sharding

      接下來,咱們使用MongoDB Shell登陸到mongos,添加Shard節點

      [root@100 shard]# /usr/local/mongoDB/bin/mongo admin --port 40000 MongoDB shell version: 2.0.7 connecting to: 127.0.0.1:40000/admin mongos> db.runCommand({ addshard:"localhost:27020" }) { "shardAdded" : "shard0000", "ok" : 1 } ...... mongos> db.runCommand({ addshard:"localhost:27029" }) { "shardAdded" : "shard0009", "ok" : 1 } mongos> db.runCommand({ enablesharding:"test" }) #設置分片存儲的數據庫 { "ok" : 1 } mongos> db.runCommand({ shardcollection: "test.log", key: { id:1,time:1}}) { "collectionsharded" : "test.log", "ok" : 1 }

      步驟五: 程序代碼內無需太大更改,直接按照鏈接普通的mongo數據庫那樣,將數據庫鏈接接入接口40000

      MongoDB 備份(mongodump)與恢復(mongorestore)


      MongoDB數據備份

      在Mongodb中咱們使用mongodump命令來備份MongoDB數據。該命令能夠導出全部數據到指定目錄中。

      mongodump命令能夠經過參數指定導出的數據量級轉存的服務器。

      語法

      mongodump命令腳本語法以下:

      >mongodump -h dbhost -d dbname -o dbdirectory
      
      • -h:

        MongDB所在服務器地址,例如:127.0.0.1,固然也能夠指定端口號:127.0.0.1:27017

      • -d:

        須要備份的數據庫實例,例如:test

      • -o:

        備份的數據存放位置,例如:c:\data\dump,固然該目錄須要提早創建,在備份完成後,系統自動在dump目錄下創建一個test目錄,這個目錄裏面存放該數據庫實例的備份數據。

      實例

      在本地使用 27017 啓動你的mongod服務。打開命令提示符窗口,進入MongoDB安裝目錄的bin目錄輸入命令mongodump:

      >mongodump
      

      執行以上命令後,客戶端會鏈接到ip爲 127.0.0.1 端口號爲 27017 的MongoDB服務上,並備份全部數據到 bin/dump/ 目錄中。命令輸出結果以下:

      MongoDB數據備份

      mongodump 命令可選參數列表以下所示:

      語法 描述 實例
      mongodump --host HOST_NAME --port PORT_NUMBER 該命令將備份全部MongoDB數據 mongodump --host w3cschool.cc --port 27017
      mongodump --dbpath DB_PATH --out BACKUP_DIRECTORY   mongodump --dbpath /data/db/ --out /data/backup/
      mongodump --collection COLLECTION --db DB_NAME 該命令將備份指定數據庫的集合。 mongodump --collection mycol --db test

      MongoDB數據恢復

      mongodb使用 mongorestore 命令來恢復備份的數據。

      語法

      mongorestore命令腳本語法以下:

      >mongorestore -h <hostname><:port> -d dbname <path>
      
      • --host <:port>, -h <:port>:

        MongoDB所在服務器地址,默認爲: localhost:27017

      • --db , -d :

        須要恢復的數據庫實例,例如:test,固然這個名稱也能夠和備份時候的不同,好比test2

      • --drop:

        恢復的時候,先刪除當前數據,而後恢復備份的數據。就是說,恢復後,備份後添加修改的數據都會被刪除,慎用哦!

      • <path>:

        mongorestore 最後的一個參數,設置備份數據所在位置,例如:c:\data\dump\test。

        你不能同時指定 <path> 和 --dir 選項,--dir也能夠設置備份目錄。

      • --dir:

        指定備份的目錄

        你不能同時指定 <path> 和 --dir 選項。

      接下來咱們執行如下命令:

      >mongorestore
      

      執行以上命令輸出結果以下:

      MongoDB數據恢復

       

       

      MongoDB 監控

      在你已經安裝部署並容許MongoDB服務後,你必需要了解MongoDB的運行狀況,並查看MongoDB的性能。這樣在大流量得狀況下能夠很好的應對並保證MongoDB正常運做。

      MongoDB中提供了mongostat 和 mongotop 兩個命令來監控MongoDB的運行狀況。


      mongostat 命令

      mongostat是mongodb自帶的狀態檢測工具,在命令行下使用。它會間隔固定時間獲取mongodb的當前運行狀態,並輸出。若是你發現數據庫忽然變慢或者有其餘問題的話,你第一手的操做就考慮採用mongostat來查看mongo的狀態。

      啓動你的Mongod服務,進入到你安裝的MongoDB目錄下的bin目錄, 而後輸入mongostat命令,以下所示:

      D:\set up\mongodb\bin>mongostat
      

      以上命令輸出結果以下:

      mongotop 命令

      mongotop也是mongodb下的一個內置工具,mongotop提供了一個方法,用來跟蹤一個MongoDB的實例,查看哪些大量的時間花費在讀取和寫入數據。 mongotop提供每一個集合的水平的統計數據。默認狀況下,mongotop返回值的每一秒。

      啓動你的Mongod服務,進入到你安裝的MongoDB目錄下的bin目錄, 而後輸入mongotop命令,以下所示:

      D:\set up\mongodb\bin>mongotop
      

      以上命令執行輸出結果以下:

      帶參數實例

       E:\mongodb-win32-x86_64-2.2.1\bin>mongotop 10
      

      後面的10是<sleeptime>參數 ,能夠不使用,等待的時間長度,以秒爲單位,mongotop等待調用之間。經過的默認mongotop返回數據的每一秒。

       E:\mongodb-win32-x86_64-2.2.1\bin>mongotop --locks
      

      報告每一個數據庫的鎖的使用中,使用mongotop - 鎖,這將產生如下輸出:

      輸出結果字段說明:

      • ns:

        包含數據庫命名空間,後者結合了數據庫名稱和集合。

      • db:

        包含數據庫的名稱。名爲 . 的數據庫針對全局鎖定,而非特定數據庫。

      • total:

        mongod花費的時間工做在這個命名空間提供總額。

      • read:

        提供了大量的時間,這mongod花費在執行讀操做,在此命名空間。

      • write:

        提供這個命名空間進行寫操做,這mongod花了大量的時間。

       

      MongoDB Java

      環境配置

      在 Java 程序中若是要使用 MongoDB,你須要確保已經安裝了 Java 環境及 MongoDB JDBC 驅動。

      本章節實例時候 Mongo 3.x 以上版本。

      你能夠參考本站的Java教程來安裝Java程序。如今讓咱們來檢測你是否安裝了 MongoDB JDBC 驅動。


      鏈接數據庫

      鏈接數據庫,你須要指定數據庫名稱,若是指定的數據庫不存在,mongo會自動建立數據庫。

      鏈接數據庫的Java代碼以下:

      import com.mongodb.MongoClient; import com.mongodb.client.MongoDatabase; public class MongoDBJDBC{ public static void main( String args[] ){ try{ // 鏈接到 mongodb 服務 MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // 鏈接到數據庫 MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol"); System.out.println("Connect to database successfully"); }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }

      如今,讓咱們來編譯運行程序並鏈接到數據庫 mycol。

      你能夠根據你的實際環境改變 MongoDB JDBC 驅動的路徑。

      本實例將 MongoDB JDBC 啓動包 mongo-java-driver-3.2.2.jar 放在本地目錄下:

      $ javac -cp .:mongo-java-driver-3.2.2.jar MongoDBJDBC.java $ java -cp .:mongo-java-driver-3.2.2.jar MongoDBJDBC Connect to database successfully Authentication: true

      本實例中 Mongo 數據庫無需用戶名密碼驗證。若是你的 Mongo 須要驗證用戶名及密碼,可使用如下代碼:

      import java.util.ArrayList; import java.util.List; import com.mongodb.MongoClient; import com.mongodb.MongoCredential; import com.mongodb.ServerAddress; import com.mongodb.client.MongoDatabase; public class MongoDBJDBC { public static void main(String[] args){ try { //鏈接到MongoDB服務 若是是遠程鏈接能夠替換「localhost」爲服務器所在IP地址  //ServerAddress()兩個參數分別爲 服務器地址 和 端口  ServerAddress serverAddress = new ServerAddress("localhost",27017); List<ServerAddress> addrs = new ArrayList<ServerAddress>(); addrs.add(serverAddress); //MongoCredential.createScramSha1Credential()三個參數分別爲 用戶名 數據庫名稱 密碼  MongoCredential credential = MongoCredential.createScramSha1Credential("username", "databaseName", "password".toCharArray()); List<MongoCredential> credentials = new ArrayList<MongoCredential>(); credentials.add(credential); //經過鏈接認證獲取MongoDB鏈接  MongoClient mongoClient = new MongoClient(addrs,credentials); //鏈接到數據庫  MongoDatabase mongoDatabase = mongoClient.getDatabase("databaseName"); System.out.println("Connect to database successfully"); } catch (Exception e) { System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }

      建立集合

      咱們可使用 com.mongodb.client.MongoDatabase 類中的createCollection()來建立集合

      代碼片斷以下:

      import com.mongodb.MongoClient; import com.mongodb.client.MongoDatabase; public class MongoDBJDBC{ public static void main( String args[] ){ try{ // 鏈接到 mongodb 服務 MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // 鏈接到數據庫 MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol"); System.out.println("Connect to database successfully"); mongoDatabase.createCollection("test"); System.out.println("集合建立成功"); }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }

      編譯運行以上程序,輸出結果以下:

      Connect to database successfully 集合建立成功

      獲取集合

      咱們可使用com.mongodb.client.MongoDatabase類的 getCollection() 方法來獲取一個集合

      代碼片斷以下:

      import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; public class MongoDBJDBC{ public static void main( String args[] ){ try{ // 鏈接到 mongodb 服務 MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // 鏈接到數據庫 MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol"); System.out.println("Connect to database successfully"); MongoCollection<Document> collection = mongoDatabase.getCollection("test"); System.out.println("集合 test 選擇成功"); }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }

      編譯運行以上程序,輸出結果以下:

      Connect to database successfully 集合 test 選擇成功

      插入文檔

      咱們可使用com.mongodb.client.MongoCollection類的 insertMany() 方法來插入一個文檔

      代碼片斷以下:

      import java.util.ArrayList; import java.util.List; import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoDatabase; public class MongoDBJDBC{ public static void main( String args[] ){ try{ // 鏈接到 mongodb 服務 MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // 鏈接到數據庫 MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol"); System.out.println("Connect to database successfully"); MongoCollection<Document> collection = mongoDatabase.getCollection("test"); System.out.println("集合 test 選擇成功"); //插入文檔  /** * 1. 建立文檔 org.bson.Document 參數爲key-value的格式 * 2. 建立文檔集合List<Document> * 3. 將文檔集合插入數據庫集合中 mongoCollection.insertMany(List<Document>) 插入單個文檔能夠用 mongoCollection.insertOne(Document) * */ Document document = new Document("title", "MongoDB"). append("description", "database"). append("likes", 100). append("by", "Fly"); List<Document> documents = new ArrayList<Document>(); documents.add(document); collection.insertMany(documents); System.out.println("文檔插入成功"); }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }

      編譯運行以上程序,輸出結果以下:

      Connect to database successfully 集合 test 選擇成功 文檔插入成功

      檢索全部文檔

      咱們可使用 com.mongodb.client.MongoCollection 類中的 find() 方法來獲取集合中的全部文檔。

      此方法返回一個遊標,因此你須要遍歷這個遊標。

      代碼片斷以下:

      import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; public class MongoDBJDBC{ public static void main( String args[] ){ try{ // 鏈接到 mongodb 服務 MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // 鏈接到數據庫 MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol"); System.out.println("Connect to database successfully"); MongoCollection<Document> collection = mongoDatabase.getCollection("test"); System.out.println("集合 test 選擇成功"); //檢索全部文檔  /** * 1. 獲取迭代器FindIterable<Document> * 2. 獲取遊標MongoCursor<Document> * 3. 經過遊標遍歷檢索出的文檔集合 * */ FindIterable<Document> findIterable = collection.find(); MongoCursor<Document> mongoCursor = findIterable.iterator(); while(mongoCursor.hasNext()){ System.out.println(mongoCursor.next()); } }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }

      編譯運行以上程序,輸出結果以下:

      Connect to database successfully 集合 test 選擇成功 Document{{_id=56e65fb1fd57a86304fe2692, title=MongoDB, description=database, likes=100, by=Fly}}

      更新文檔

      你可使用 com.mongodb.client.MongoCollection 類中的 updateMany() 方法來更新集合中的文檔。

      代碼片斷以下:

      import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; public class MongoDBJDBC{ public static void main( String args[] ){ try{ // 鏈接到 mongodb 服務 MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // 鏈接到數據庫 MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol"); System.out.println("Connect to database successfully"); MongoCollection<Document> collection = mongoDatabase.getCollection("test"); System.out.println("集合 test 選擇成功"); //更新文檔 將文檔中likes=100的文檔修改成likes=200  collection.updateMany(Filters.eq("likes", 100), new Document("$set",new Document("likes",200))); //檢索查看結果  FindIterable<Document> findIterable = collection.find(); MongoCursor<Document> mongoCursor = findIterable.iterator(); while(mongoCursor.hasNext()){ System.out.println(mongoCursor.next()); } }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }

      編譯運行以上程序,輸出結果以下:

      Connect to database successfully 集合 test 選擇成功 Document{{_id=56e65fb1fd57a86304fe2692, title=MongoDB, description=database, likes=200, by=Fly}}

      刪除第一個文檔

      要刪除集合中的第一個文檔,首先你須要使用com.mongodb.DBCollection類中的 findOne()方法來獲取第一個文檔,而後使用remove 方法刪除。

      代碼片斷以下:

      import org.bson.Document; import com.mongodb.MongoClient; import com.mongodb.client.FindIterable; import com.mongodb.client.MongoCollection; import com.mongodb.client.MongoCursor; import com.mongodb.client.MongoDatabase; import com.mongodb.client.model.Filters; public class MongoDBJDBC{ public static void main( String args[] ){ try{ // 鏈接到 mongodb 服務 MongoClient mongoClient = new MongoClient( "localhost" , 27017 ); // 鏈接到數據庫 MongoDatabase mongoDatabase = mongoClient.getDatabase("mycol"); System.out.println("Connect to database successfully"); MongoCollection<Document> collection = mongoDatabase.getCollection("test"); System.out.println("集合 test 選擇成功"); //刪除符合條件的第一個文檔  collection.deleteOne(Filters.eq("likes", 200)); //刪除全部符合條件的文檔  collection.deleteMany (Filters.eq("likes", 200)); //檢索查看結果  FindIterable<Document> findIterable = collection.find(); MongoCursor<Document> mongoCursor = findIterable.iterator(); while(mongoCursor.hasNext()){ System.out.println(mongoCursor.next()); } }catch(Exception e){ System.err.println( e.getClass().getName() + ": " + e.getMessage() ); } } }

      編譯運行以上程序,輸出結果以下:

      Connect to database successfully 集合 test 選擇成功

      更多操做能夠參考:http://mongodb.github.io/mongo-java-driver/3.0/driver/getting-started/quick-tour/

      參考文檔:http://blog.csdn.net/ererfei/article/details/50857103

       

       

      MongoDBPHP 擴展

      本教程將向你們介紹如何在Linux、window、Mac平臺上安裝MongoDB擴展。


      Linux上安裝 MongoDB PHP擴展

      在終端上安裝

      你能夠在linux中執行如下命令來安裝MongoDB 的 PHP 擴展驅動

      $ sudo pecl install mongo
      

      使用php的pecl安裝命令必須保證網絡鏈接可用以及root權限。

      安裝手冊

      若是你想經過源碼來編譯擴展驅動。你必須手動編譯源碼包,這樣作的好是最新修正的bug包含在源碼包中。

      你能夠在Github上下載MongoDB PHP驅動包。訪問github網站而後搜索"mongo php driver"(下載地址:https://github.com/mongodb/mongo-php-driver),下載該源碼包,而後執行如下命令:

      $ tar zxvf mongodb-mongodb-php-driver-<commit_id>.tar.gz
      $ cd mongodb-mongodb-php-driver-<commit_id>
      $ phpize
      $ ./configure
      $ sudo make install
      

      若是你的php是本身編譯的,則安裝方法以下(假設是編譯在/usr/local/php目錄中):

      $ tar zxvf mongodb-mongodb-php-driver-<commit_id>.tar.gz
      $ cd mongodb-mongodb-php-driver-<commit_id>
      $ /usr/local/php/bin/phpize
      $ ./configure --with-php-config=/usr/local/php/bin/php-config
      $ sudo make install
      

      執行以上命令後,你須要修改php.ini文件,在php.ini文件中添加mongo配置,配置以下:

      extension=mongo.so
      

      注意:你須要指明 extension_dir 配置項的路徑。


      window上安裝 MongoDB PHP擴展

      Github上已經提供了用於window平臺的預編譯php mongodb驅動二進制包(下載地址: https://s3.amazonaws.com/drivers.mongodb.org/php/index.html),你能夠下載與你php對應的版本,可是你須要注意如下幾點問題:

      • VC6 是運行於 Apache 服務器
      • 'Thread safe'(線程安全)是運行在Apache上以模塊的PHP上,若是你以CGI的模式運行PHP,請選擇非線程安全模式(' non-thread safe')。
      • VC9是運行於 IIS 服務器上。
      • 下載完你須要的二進制包後,解壓壓縮包,將'php_mongo.dll'文件添加到你的PHP擴展目錄中(ext)。ext目錄一般在PHP安裝目錄下的ext目錄。

      打開php配置文件 php.ini 添加如下配置:

      extension=php_mongo.dll
      

      重啓服務器。

      經過瀏覽器訪問phpinfo,若是安裝成功,就會看到類型如下的信息:

      mongo-php-driver-installed-windows


      MAC中安裝MongoDB PHP擴展驅動

      你可使用'autoconf'安裝MongoDB PHP擴展驅動。

      你可使用'Xcode'安裝MongoDB PHP擴展驅動。

      若是你使用 XAMPP,你可使用如下命令安裝MongoDB PHP擴展驅動:

      sudo /Applications/XAMPP/xamppfiles/bin/pecl install mongo
      

      若是以上命令在XMPP或者MAMP中不起做用,你須要在Github上下載兼容的預編譯包。

      而後添加 'extension=mongo.so' 配置到你的php.ini文件中。

       

      MongoDB PHP

      在php中使用mongodb你必須使用 mongodb 的 php驅動。

      MongoDB PHP在各平臺上的安裝及驅動包下載請查看:PHP安裝MongoDB擴展驅動

      若是你使用的是 PHP7,請參閱:PHP7 MongoDB 安裝與使用

      確保鏈接及選擇一個數據庫

      爲了確保正確鏈接,你須要指定數據庫名,若是數據庫在mongoDB中不存在,mongoDB會自動建立

      代碼片斷以下:

      <?php
      $m = new MongoClient(); // 鏈接默認主機和端口爲:mongodb://localhost:27017
      $db = $m->test; // 獲取名稱爲 "test" 的數據庫
      ?>
      

      建立集合

      建立集合的代碼片斷以下:

      <?php
      $m = new MongoClient(); // 鏈接
      $db = $m->test; // 獲取名稱爲 "test" 的數據庫
      $collection = $db->createCollection("runoob");
      echo "集合建立成功";
      ?>
      

      執行以上程序,輸出結果以下:

      集合建立成功
      

      插入文檔

      在mongoDB中使用 insert() 方法插入文檔:

      插入文檔代碼片斷以下:

      <?php
      $m = new MongoClient();    // 鏈接到mongodb
      $db = $m->test;            // 選擇一個數據庫
      $collection = $db->runoob; // 選擇集合
      $document = array( 
      	"title" => "MongoDB", 
      	"description" => "database", 
      	"likes" => 100,
      	"url" => "http://www.runoob.com/mongodb/",
      	"by", "菜鳥教程"
      );
      $collection->insert($document);
      echo "數據插入成功";
      ?>
      

      執行以上程序,輸出結果以下:

      數據插入成功
      

      而後咱們在 mongo 客戶端使用 db.runoob.find().pretty(); 命令查看數據:


      查找文檔

      使用find() 方法來讀取集合中的文檔。

      讀取使用文檔的代碼片斷以下:

      <?php
      $m = new MongoClient();    // 鏈接到mongodb
      $db = $m->test;            // 選擇一個數據庫
      $collection = $db->runoob; // 選擇集合
      
      $cursor = $collection->find();
      // 迭代顯示文檔標題
      foreach ($cursor as $document) {
      	echo $document["title"] . "\n";
      }
      ?>
      

      執行以上程序,輸出結果以下:

      MongoDB
      

      更新文檔

      使用 update() 方法來更新文檔。

      如下實例將更新文檔中的標題爲' MongoDB 教程', 代碼片斷以下:

      <pre>
      <?php
      $m = new MongoClient();    // 鏈接到mongodb
      $db = $m->test;            // 選擇一個數據庫
      $collection = $db->runoob; // 選擇集合
      // 更新文檔
      $collection->update(array("title"=>"MongoDB"), array('$set'=>array("title"=>"MongoDB 教程")));
      // 顯示更新後的文檔
      $cursor = $collection->find();
      // 循環顯示文檔標題
      foreach ($cursor as $document) {
      	echo $document["title"] . "\n";
      }
      ?>
      

      執行以上程序,輸出結果以下:

      MongoDB 教程
      

      而後咱們在 mongo 客戶端使用 db.runoob.find().pretty(); 命令查看數據:


      刪除文檔

      使用 remove() 方法來刪除文檔。

      如下實例中咱們將移除 'title' 爲 'MongoDB 教程' 的一條數據記錄。, 代碼片斷以下:

      <?php
      $m = new MongoClient();    // 鏈接到mongodb
      $db = $m->test;            // 選擇一個數據庫
      $collection = $db->runoob; // 選擇集合
         
      // 移除文檔
      $collection->remove(array("title"=>"MongoDB 教程"), array("justOne" => true));
      
      // 顯示可用文檔數據
      $cursor = $collection->find();
      foreach ($cursor as $document) {
      	echo $document["title"] . "\n";
      }
      ?>
      

      除了以上實例外,在php中你還可使用findOne(), save(), limit(), skip(), sort()等方法來操做Mongodb數據庫。

      更多的操做方法能夠參考 Mongodb 核心類:http://php.net/manual/zh/mongo.core.php

       

      PHP7 MongDB 安裝與使用

      本文教程只適合在 PHP7 的環境,若是你是 PHP5 環境,你能夠參閱 PHP MongDB 安裝與使用

      PHP7 Mongdb 擴展安裝

      咱們使用 pecl 命令來安裝:

      $ /usr/local/php7/bin/pecl install mongodb

      執行成功後,會輸出如下結果:

      …… Build process completed successfully Installing '/usr/local/php7/lib/php/extensions/no-debug-non-zts-20151012/mongodb.so' install ok: channel://pecl.php.net/mongodb-1.1.7 configuration option "php_ini" is not set to php.ini location You should add "extension=mongodb.so" to php.ini

      接下來咱們打開 php.ini 文件,添加 extension=mongodb.so 配置。

      能夠直接執行如下命令來添加。

      $ echo "extension=mongodb.so" >> `/usr/local/php7/bin/php --ini | grep "Loaded Configuration" | sed -e "s|.*:\s*||"`

      注意:以上執行的命令中 php7 的安裝目錄爲 /usr/local/php7/,若是你安裝在其餘目錄,須要相應修改 pecl 與 php 命令的路徑。


      Mongodb 使用

      PHP7 鏈接 MongoDB 語法以下:

      $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017");

      插入數據

      將 name 爲"菜鳥教程" 的數據插入到 test 數據庫的 runoob 集合中。

      <?php $bulk = new MongoDB\Driver\BulkWrite; $document = ['_id' => new MongoDB\BSON\ObjectID, 'name' => '菜鳥教程']; $_id= $bulk->insert($document); var_dump($_id); $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000); $result = $manager->executeBulkWrite('test.runoob', $bulk, $writeConcern); ?>

      讀取數據

      這裏咱們將三個網址數據插入到 test 數據庫的 sites 集合,並讀取迭代出來:

      <?php $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); // 插入數據 $bulk = new MongoDB\Driver\BulkWrite; $bulk->insert(['x' => 1, 'name'=>'菜鳥教程', 'url' => 'http://www.runoob.com']); $bulk->insert(['x' => 2, 'name'=>'Google', 'url' => 'http://www.google.com']); $bulk->insert(['x' => 3, 'name'=>'taobao', 'url' => 'http://www.taobao.com']); $manager->executeBulkWrite('test.sites', $bulk); $filter = ['x' => ['$gt' => 1]]; $options = [ 'projection' => ['_id' => 0], 'sort' => ['x' => -1], ]; // 查詢數據 $query = new MongoDB\Driver\Query($filter, $options); $cursor = $manager->executeQuery('test.sites', $query); foreach ($cursor as $document) { print_r($document); } ?>

      輸出結果爲:

      stdClass Object ( [x] => 3 [name] => taobao [url] => http://www.taobao.com ) stdClass Object ( [x] => 2 [name] => Google [url] => http://www.google.com )

      更新數據

      接下來咱們將更新 test 數據庫 sites 集合中 x 爲 2 的數據:

      <?php $bulk = new MongoDB\Driver\BulkWrite; $bulk->update( ['x' => 2], ['$set' => ['name' => '菜鳥工具', 'url' => 'tool.runoob.com']], ['multi' => false, 'upsert' => false] ); $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000); $result = $manager->executeBulkWrite('test.sites', $bulk, $writeConcern); ?>

      接下來咱們使用 "db.sites.find()" 命令查看數據的變化,x 爲 2 的數據已經變成了菜鳥工具:

      刪除數據

      如下實例刪除了 x 爲 1 和 x 爲 2的數據,注意 limit 參數的區別:

      <?php $bulk = new MongoDB\Driver\BulkWrite; $bulk->delete(['x' => 1], ['limit' => 1]); // limit 爲 1 時,刪除第一條匹配數據 $bulk->delete(['x' => 2], ['limit' => 0]); // limit 爲 0 時,刪除全部匹配數據 $manager = new MongoDB\Driver\Manager("mongodb://localhost:27017"); $writeConcern = new MongoDB\Driver\WriteConcern(MongoDB\Driver\WriteConcern::MAJORITY, 1000); $result = $manager->executeBulkWrite('test.sites', $bulk, $writeConcern); ?>

      更多使用方法請參考:http://php.net/manual/en/book.mongodb.php

       

       

      Node.js 鏈接 MongoDB

      MongoDB是一種文檔導向數據庫管理系統,由C++撰寫而成。

      本章節咱們將爲你們介紹如何使用 Node.js 來鏈接 MongoDB,並對數據庫進行操做。

      若是你尚未 MongoDB 的基本知識,能夠參考咱們的教程:MongoDB 教程

      安裝驅動

      本教程使用了淘寶定製的 cnpm 命令進行安裝:

      $ cnpm install mongodb
      

      接下來咱們來實現增刪改查功能。


      數據庫操做( CURD )

      與 MySQL 不一樣的是 MongoDB 會自動建立數據庫和集合,因此使用前咱們不須要手動去建立。

      插入數據

      如下實例咱們鏈接數據庫 runoob 的 site 表,並插入兩條數據:

      插入數據

      var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/runoob'; # 數據庫爲 runoob var insertData = function(db, callback) { //鏈接到表 site var collection = db.collection('site'); //插入數據 var data = [{"name":"菜鳥教程","url":"www.runoob.com"},{"name":"菜鳥工具","url":"c.runoob.com"}]; collection.insert(data, function(err, result) { if(err) { console.log('Error:'+ err); return; } callback(result); }); } MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("鏈接成功!"); insertData(db, function(result) { console.log(result); db.close(); }); });

      執行如下命令輸出就結果爲:

      $ node test.js
      鏈接成功!
      { result: { ok: 1, n: 2 },
        ops: 
         [ { name: '菜鳥教程',
             url: 'www.runoob.com',
             _id: 58c25e13a08de70d3b9d4116 },
           { name: '菜鳥工具',
             url: 'c.runoob.com',
             _id: 58c25e13a08de70d3b9d4117 } ],
        insertedCount: 2,
        insertedIds: [ 58c25e13a08de70d3b9d4116, 58c25e13a08de70d3b9d4117 ] }
      

      從輸出結果來看,數據已插入成功。

      咱們也能夠打開 MongoDB 的客戶端查看數據,如:

      > show dbs
      admin   0.000GB
      local   0.000GB
      runoob  0.000GB          # 自動建立了 runoob 數據庫
      > show tables
      site                     # 自動建立了 site 集合(數據表)
      > db.site.find()         # 查看集合中的數據
      { "_id" : ObjectId("58c25f300cd56e0d7ddfc0c8"), "name" : "菜鳥教程", "url" : "www.runoob.com" }
      { "_id" : ObjectId("58c25f300cd56e0d7ddfc0c9"), "name" : "菜鳥工具", "url" : "c.runoob.com" }
      > 
      

      查詢數據

      如下實例檢索 name 爲 "菜鳥教程" 的實例:

      查詢數據

      var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/runoob'; var selectData = function(db, callback) { //鏈接到表 var collection = db.collection('site'); //查詢數據 var whereStr = {"name":'菜鳥教程'}; collection.find(whereStr).toArray(function(err, result) { if(err) { console.log('Error:'+ err); return; } callback(result); }); } MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("鏈接成功!"); selectData(db, function(result) { console.log(result); db.close(); }); });

      執行如下命令輸出就結果爲:

      鏈接成功!
      [ { _id: 58c25f300cd56e0d7ddfc0c8,
          name: '菜鳥教程',
          url: 'www.runoob.com' } ]
      

      更新數據

      咱們也能夠對數據庫的數據進行修改,如下實例將 name 爲 "菜鳥教程" 的 url 改成 https://www.runoob.com:

      更新數據

      var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/runoob'; var updateData = function(db, callback) { //鏈接到表 var collection = db.collection('site'); //更新數據 var whereStr = {"name":'菜鳥教程'}; var updateStr = {$set: { "url" : "https://www.runoob.com" }}; collection.update(whereStr,updateStr, function(err, result) { if(err) { console.log('Error:'+ err); return; } callback(result); }); } MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("鏈接成功!"); updateData(db, function(result) { console.log(result); db.close(); }); });

      執行成功後,進入 mongo 管理工具查看數據已修改:

      > db.site.find()
      { "_id" : ObjectId("58c25f300cd56e0d7ddfc0c8"), "name" : "菜鳥教程", "url" : "https://www.runoob.com" }
      { "_id" : ObjectId("58c25f300cd56e0d7ddfc0c9"), "name" : "菜鳥工具", "url" : "c.runoob.com" }
      

      刪除數據

      如下實例將 name 爲 "菜鳥工具" 的數據刪除 :

      刪除數據

      var MongoClient = require('mongodb').MongoClient; var DB_CONN_STR = 'mongodb://localhost:27017/runoob'; var delData = function(db, callback) { //鏈接到表 var collection = db.collection('site'); //刪除數據 var whereStr = {"name":'菜鳥工具'}; collection.remove(whereStr, function(err, result) { if(err) { console.log('Error:'+ err); return; } callback(result); }); } MongoClient.connect(DB_CONN_STR, function(err, db) { console.log("鏈接成功!"); delData(db, function(result) { console.log(result); db.close(); }); });

      執行成功後,進入 mongo 管理工具查看數據已刪除:

      > db.site.find()
      { "_id" : ObjectId("58c25f300cd56e0d7ddfc0c8"), "name" : "菜鳥教程", "url" : "https://www.runoob.com" }
      > 
相關文章
相關標籤/搜索