
MongoDB 簡介
Mongo 并非芒果(Mango)的意思,而是源于 Humongous(巨大的;龐大的)一詞。
MongoDB 是一個基于分布式文件存儲的 NoSQL 數(shù)據(jù)庫。由 C++ 語言編寫。旨在為 WEB 應(yīng)用提供可擴展的高性能數(shù)據(jù)存儲解決方案。關(guān)于什么是 NoSQL 可閱讀《學(xué)了那么多 NoSQL 數(shù)據(jù)庫 NoSQL 究竟是啥》
MongoDB 是一個介于關(guān)系型數(shù)據(jù)庫和非關(guān)系型數(shù)據(jù)庫之間的產(chǎn)品,是非關(guān)系型數(shù)據(jù)庫當中功能最豐富,最像關(guān)系數(shù)據(jù)庫的。


MongoDB 使用 BSON(Binary JSON)對象來存儲,與 JSON 格式的鍵值對(key/value)類似,字段值可以包含其他文檔,數(shù)組及文檔數(shù)組。支持的查詢語言非常強大,其語法有點類似于面向?qū)ο蟮牟樵冋Z言,幾乎可以實現(xiàn)類似關(guān)系型數(shù)據(jù)庫單表查詢的絕大部分功能,而且還支持對數(shù)據(jù)建立索引。
MongoDB 歷史
2007 年,Dwight Merriman,Eliot Horowitz 和 Kevin Ryan 成立 10gen 軟件公司,在成立之初,這家的公司目標是進軍云計算行業(yè),為企業(yè)提供云計算服務(wù)。在開發(fā)云計算產(chǎn)品時,他們準備開發(fā)一個類似于數(shù)據(jù)庫的組件,為云計算產(chǎn)品提供存儲服務(wù)。當時是關(guān)系型數(shù)據(jù)庫一統(tǒng)天下的時間,他們覺得傳統(tǒng)的關(guān)系型數(shù)據(jù)庫無法滿足他們的要求,他們想要一款程序員不懂SQL語言也可以使用的數(shù)據(jù)存儲產(chǎn)品。
在網(wǎng)絡(luò)上找了一圈,不管是開源的還是閉源的產(chǎn)品,都沒找到讓他們滿意的東西,既然找不到,那就自己開發(fā)吧,反正他們也有那個技術(shù)實力,10gen 的創(chuàng)始人都來自谷歌,他們創(chuàng)建的網(wǎng)絡(luò)廣告公司 DoubleClick 被谷歌收購了,這是他們的第二次創(chuàng)業(yè)。
10gen 公司不使用關(guān)系型數(shù)據(jù)庫是有一定原因的,當時他們還在 DoubleClick 公司的時候,就吃過關(guān)系型數(shù)據(jù)庫的苦頭。DoubleClick 是一家網(wǎng)絡(luò)廣告公司,服務(wù)美國眾多的知名公司,該公司每秒提供 40 萬個廣告,但在可伸縮性和敏捷性方面經(jīng)常遇到困難,因此他們不得不經(jīng)常自己開發(fā)和使用許多自定義數(shù)據(jù)存儲來解決現(xiàn)有關(guān)系型數(shù)據(jù)庫的不足,這讓他們很是苦惱。
因此他們決定開發(fā)一款數(shù)據(jù)庫產(chǎn)品解決他們在 DoubleClick 時遇到的問題,并為自己的云計算產(chǎn)品提供存儲服務(wù)。
- MongoDB 最初于 2007 年開發(fā),由位于紐約的一個名為
10gen的組織開發(fā),現(xiàn)在被稱為MongoDB Inc. - 2009 年,經(jīng)過將近 2 年的開發(fā),10gen 開發(fā)出了 MongoDB 的雛形并將它開源以及正式命名為 MongoDB,同時成立開源社區(qū),通過社區(qū)運營 MongoDB。
- 2009 年 02 月 MongoDB 1.0 發(fā)布,提供了大部分基本的查詢功能。
- 2009 年 12 月 MongoDB 1.2 發(fā)布,引入了 map-reduce,支持大規(guī)模數(shù)據(jù)處理。
- MongoDB 的第一個真正產(chǎn)品是從 2010 年 03 月發(fā)布的 MongoDB 1.4 版本開始的。
- 2010 年 8 月 MongoDB 1.6 發(fā)布,引入了一些主要特性,比如用于水平伸縮的分片、具備自動故障轉(zhuǎn)移能力的副本集以及對 IPv6 的支持。
- 2012 年 05 月 23 日,MongoDB 2.1 發(fā)布。該版本采用全新架構(gòu),包含諸多增強。
- 2012 年 06 月 06 日,MongoDB 2.0.6 發(fā)布,分布式文檔數(shù)據(jù)庫。
- 2012 年 8 月 MongoDB 2.2 發(fā)布,引入了聚合管道,可以將多個數(shù)據(jù)處理步驟組合成一個操作鏈。
- 2013 年 MongoDB 推出第一款商業(yè)版本 MongoDB Enterprise Advanced。
- 2013 年 04 月 23 日,MongoDB 2.4.3 發(fā)布,此版本包括了一些性能優(yōu)化,功能增強以及 bug 修復(fù)。
- 2013 年 08 月 20 日,MongoDB 2.4.6 發(fā)布,仍然是以性能優(yōu)化,功能增強和 bug 修復(fù)為主。
- 2015 年 03 月 MongoDB 3.0 發(fā)布,包含了新的 WiredTiger 存儲引擎、可插拔存儲引擎 API、增加了 50 個副本集限制和安全改進。同年晚些時候又發(fā)布了 3.2 版本,支持文檔驗證、部分索引和一些主要的聚合增強。
- 2016 年 MongoDB 推出了 Atlas 服務(wù),MongoDB Atlas,與公有云服務(wù)廠商(谷歌、微軟Azure)合作。這一年,MongoDB 爆出了非常嚴重的安全門事件,黑客通過 MongoDB 的默認監(jiān)聽地址 0.0.0.0 刪除數(shù)據(jù),并且通過此漏洞進行勒索,支付 0.2 到 0.5 的比特幣就可以恢復(fù)數(shù)據(jù)。
- 2017 年 10 月 MongoDB 公司成立 10 周年之際,順利通過 IPO 在紐交所上市。開盤 24 美元,公司估值達到 16 億美元,并獲得 1.92 美元的籌資。
- 2017 年 11 月 MongoDB 3.6 發(fā)布,為多集合連接查詢、變更流和使用 JSON 模式進行文檔驗證提供了更好的支持。
- 2018 年 06 月 MongoDB 4.0 發(fā)布,這一版本的發(fā)布獲得了廣泛的關(guān)注,提供了跨文檔事務(wù)處理能力。這是一個重要的里程碑,MongoDB 已經(jīng)為高數(shù)據(jù)完整性需求做好了準備。
- 2019 年 03 月 18 日,F(xiàn)orrester 授予 MongoDB NoSQL 領(lǐng)導(dǎo)者稱號。
- 2019 年 10 月 MongoDB 4.2 發(fā)布,開始支持分布式事務(wù)。
- 截至 2020 年 10 月,MongoDB 的社區(qū)版版本是 4.4.1,擴展性和性能增強,降低復(fù)制延遲,可用性和容錯性增強,查詢能力和易用性增強,MongoDB 云平臺的功能更新。MongoDB 逐漸的從一個專注于數(shù)據(jù)庫服務(wù)的廠商,轉(zhuǎn)變?yōu)樘峁?shù)據(jù)平臺服務(wù)的廠商。
截至 2020 年,MongoDB 的全球下載量達到了 1.1 億次。MongoDB 公司目前有 2000 多名員工,有超過 18000 名付費客戶,其中有很多客戶同時使用 MongoDB Atlas 和 MongoDB 企業(yè)版。大多數(shù)大公司在內(nèi)部的一些場景中仍然使用的是社區(qū)版。MongoDB 社區(qū)版仍然是開源的,除了一些關(guān)鍵特性外,它與 MongoDB 企業(yè)版差不多。
MongoDB 支持語言

MongoDB 與關(guān)系型數(shù)據(jù)庫術(shù)語對比

| SQL 術(shù)語概念 | MongoDB 術(shù)語概念 |
|---|---|
| database(數(shù)據(jù)庫) | database(數(shù)據(jù)庫) |
| table(表) | collection(集合) |
| row(行) | document or BSON document(文檔) |
| column(列) | field(字段) |
| index(索引) | index(索引) |
| table joins(表連接) | embedded documents and linking(嵌入的文檔和鏈接) |
| primary key Specify any unique column or column combination as primary key.(指定任意唯一的列或列組合作為主鍵) | primary keyIn MongoDB, the primary key isautomatically set to the _id field.(在 MongoDB 中,主鍵被自動設(shè)置為 _id 字段) |
| aggregation (e.g. group by) | MongoDB provides three ways to perform aggregation: the aggregation pipeline, the map-reduce function, and single purpose aggregation methods.(聚合操作) |
MongoDB 數(shù)據(jù)類型
| 數(shù)據(jù)類型 | 描述 |
|---|---|
| String | 字符串。存儲數(shù)據(jù)常用的數(shù)據(jù)類型。在 MongoDB 中,UTF-8 編碼的字符串才是合法的。 |
| Integer | 整型數(shù)值。用于存儲數(shù)值。根據(jù)你所采用的服務(wù)器,可分為 32 位或 64 位。 |
| Boolean | 布爾值。用于存儲布爾值(真/假)。 |
| Double | 雙精度浮點值。用于存儲浮點值。 |
| Min/Max keys | 將一個值與 BSON(二進制的 JSON)元素的最低值和最高值相對比。 |
| Arrays | 用于將數(shù)組或列表或多個值存儲為一個鍵。 |
| Timestamp | 時間戳。記錄文檔修改或添加的具體時間。 |
| Object | 用于內(nèi)嵌文檔。 |
| Null | 用于創(chuàng)建空值。 |
| Symbol | 符號。該數(shù)據(jù)類型基本上等同于字符串類型,但不同的是,它一般用于采用特殊符號類型的語言。 |
| Date | 日期時間。用 UNIX 時間格式來存儲當前日期或時間。你可以指定自己的日期時間:創(chuàng)建 Date 對象,傳入年月日信息。 |
| Object ID | 對象 ID。用于創(chuàng)建文檔的 ID。 |
| Binary Data | 二進制數(shù)據(jù)。用于存儲二進制數(shù)據(jù)。 |
| Code | 代碼類型。用于在文檔中存儲 JavaScript 代碼。 |
| Regular expression | 正則表達式類型。用于存儲正則表達式。 |
MongoDB 下載與安裝
下載
官網(wǎng):https://www.mongodb.com/
下載地址:https://www.mongodb.com/try/download/community
在頁面中選擇 MongoDB Community Server 社區(qū)版,根據(jù)自己的系統(tǒng)選擇對應(yīng)的版本,我自己使用的是 CentOS 版本。而 MongoDB 只有 RedHat 版本,下載使用即可。
CentOS 是 Community ENTerprise Operating System 的簡稱,也可以叫它社區(qū)企業(yè)操作系統(tǒng),是 Linux 操作系統(tǒng)中的一個發(fā)行版本。
CentOS 并不是全新的 Linux 發(fā)行版,它是 Red Hat 家族發(fā)行的企業(yè)版的產(chǎn)品 Red Hat Enterprise Linux(以下稱之為 RHEL)的克隆版本。RHEL 是很多企業(yè)采用的 Linux 發(fā)行版本,需要向 Red Hat 付費才可以使用,并能得到付費對應(yīng)的服務(wù),技術(shù)支持和版本升級。CentOS 可以像 RHEL 一樣的構(gòu)筑 Linux 系統(tǒng)環(huán)境,但不需要向 Red Hat 支付任何的產(chǎn)品和服務(wù)費用,同時也得不到任何有償技術(shù)支持和升級服務(wù)。

還可以通過:https://docs.mongodb.com/manual/installation/ 確認該版本軟件是否支持你的操作系統(tǒng)。

安裝
將資源上傳至服務(wù)器 /usr/local/src,解壓至 /usr/local 并重命名為 mongodb。
# 創(chuàng)建 mongodb 目錄
mkdir -p /usr/local/mongodb
# 解壓 mongodb 至指定目錄
tar -zxvf /usr/local/src/mongodb-linux-x86_64-rhel70-4.4.1.tgz -C /usr/local/
# 重命名解壓目錄為 mongodb
mv /usr/local/mongodb-linux-x86_64-rhel70-4.4.1/ /usr/local/mongodb
創(chuàng)建數(shù)據(jù)/日志目錄
創(chuàng)建用于存放數(shù)據(jù)和日志的文件夾,并修改其權(quán)限增加讀寫權(quán)限。
# 創(chuàng)建存放數(shù)據(jù)的目錄
mkdir -p /usr/local/mongodb/data/db
# 創(chuàng)建存放日志的目錄
mkdir -p /usr/local/mongodb/logs
# 創(chuàng)建日志記錄文件
touch /usr/local/mongodb/logs/mongodb.log
啟動 MongoDB
前臺啟動
MongoDB 的默認啟動方式為前臺啟動。所謂的前臺啟動就是 MongoDB 啟動進程后會占用當前的終端窗口。
# 切換至指定目錄
cd /usr/local/mongodb/
# 前臺啟動
bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0
-
--dbpath:指定數(shù)據(jù)文件存放目錄 -
--logpath:指定日志文件,注意是指定文件不是目錄 -
--logappend:使用追加的方式記錄日志 -
--port:指定端口,默認為 27017 -
--bind_ip:綁定服務(wù) IP,若綁定 127.0.0.1,則只能本機訪問,默認為本機地址
后臺啟動
所謂的后臺啟動就是以守護進程的方式啟動 MongoDB。命令中添加 --fork 即可。
# 后臺啟動
bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork
通過命令啟動的方式并不適合管理,畢竟每次輸入命令都需要考慮各參數(shù)的配置。我們可以通過配置文件來配置啟動參數(shù),然后通過指定配置文件的方式啟動服務(wù),這樣在管理 MongoDB 上就比較方便了。
配置文件
在 bin 目錄下增加一個 mongodb.conf 配置文件。
# 數(shù)據(jù)文件存放目錄
dbpath = /usr/local/mongodb/data/db
# 日志文件存放目錄
logpath = /usr/local/mongodb/logs/mongodb.log
# 以追加的方式記錄日志
logappend = true
# 端口默認為 27017
port = 27017
# 對訪問 IP 地址不做限制,默認為本機地址
bind_ip = 0.0.0.0
# 以守護進程的方式啟用,即在后臺運行
fork = true
啟動
# 切換至指定目錄
cd /usr/local/mongodb/
# 指定配置文件的方式啟動服務(wù)
bin/mongod -f bin/mongodb.conf
客戶端訪問
可以通過 bin 目錄中的 mongo 來訪問 MongoDB 服務(wù)器。
命令為:bin/mongo --host 連接的主機地址(默認127.0.0.1) --port 端口(默認27017)
[root@localhost mongodb]# bin/mongo
MongoDB shell version v4.4.1
connecting to: mongodb://127.0.0.1:27017/?compressors=disabled&gssapiServiceName=mongodb
Implicit session: session { "id" : UUID("2bf54fad-83bc-444c-8bee-166a224445b8") }
MongoDB server version: 4.4.1
---
The server generated these startup warnings when booting:
2020-10-21T10:47:44.855+08:00: ***** SERVER RESTARTED *****
2020-10-21T10:47:47.024+08:00: Access control is not enabled for the database. Read and write access to data and configuration is unrestricted
2020-10-21T10:47:47.024+08:00: You are running this process as the root user, which is not recommended
2020-10-21T10:47:47.024+08:00: /sys/kernel/mm/transparent_hugepage/enabled is 'always'. We suggest setting it to 'never'
2020-10-21T10:47:47.024+08:00: /sys/kernel/mm/transparent_hugepage/defrag is 'always'. We suggest setting it to 'never'
2020-10-21T10:47:47.024+08:00: Soft rlimits too low
2020-10-21T10:47:47.024+08:00: currentValue: 1024
2020-10-21T10:47:47.024+08:00: recommendedMinimum: 64000
---
---
Enable MongoDB's free cloud-based monitoring service, which will then receive and display
metrics about your deployment (disk utilization, CPU, operation statistics, etc).
The monitoring data will be available on a MongoDB website with a unique URL accessible to you
and anyone you share the URL with. MongoDB may use this information to make product
improvements and to suggest MongoDB products and deployment options to you.
To enable free monitoring, run the following command: db.enableFreeMonitoring()
To permanently disable this reminder, run the following command: db.disableFreeMonitoring()
---
>
help 幫助命令。
> help
db.help() help on db methods
db.mycoll.help() help on collection methods
sh.help() sharding helpers
rs.help() replica set helpers
help admin administrative help
help connect connecting to a db help
help keys key shortcuts
help misc misc things to know
help mr mapreduce
show dbs show database names
show collections show collections in current database
show users show users in current database
show profile show most recent system.profile entries with time >= 1ms
show logs show the accessible logger names
show log [name] prints out the last segment of log in memory, 'global' is default
use <db_name> set current database
db.mycoll.find() list objects in collection mycoll
db.mycoll.find( { a : 1 } ) list objects in mycoll where a == 1
it result of the last line evaluated; use to further iterate
DBQuery.shellBatchSize = x set default number of items to display on shell
exit quit the mongo shell
db.version() 查看版本信息。
> db.version()
4.4.1
show dbs 查看所有數(shù)據(jù)庫。
> show dbs
admin 0.000GB
config 0.000GB
local 0.000GB
這里先簡單通過客戶端進行訪問測試,后面會詳細羅列客戶端操作 MongoDB 數(shù)據(jù)庫、集合、文檔、索引、內(nèi)置函數(shù)等相關(guān)的操作。
關(guān)閉 MongoDB
前臺啟動關(guān)閉
使用 Ctrl + c 即可關(guān)閉。
后臺啟動關(guān)閉
使用 --shutdown 參數(shù)即可關(guān)閉。
# 命令啟動方式的關(guān)閉
bin/mongod --dbpath /usr/local/mongodb/data/db/ --logpath /usr/local/mongodb/logs/mongodb.log --logappend --port 27017 --bind_ip 0.0.0.0 --fork --shutdown
# 配置文件啟動方式的關(guān)閉
bin/mongod -f bin/mongodb.conf --shutdown
kill 命令關(guān)閉
通過 kill -9 的方式強制關(guān)閉進程,一般這種方式都不怎么推薦使用。
# 查看 mongodb 運行的進程信息
ps -ef | grep mongodb
# kill -9 強制關(guān)閉
kill -9 pid

MongoDB 函數(shù)關(guān)閉
連接到 MongoDB 服務(wù)后,切換到 admin 數(shù)據(jù)庫,并使用相關(guān)函數(shù)關(guān)閉服務(wù)。
# 連接 mongodb
bin/mongo
# 切換 admin 數(shù)據(jù)庫
use admin
# 執(zhí)行以下函數(shù)(2選1)即可關(guān)閉服務(wù)
db.shutdownServer()
db.runCommand(“shutdown”)
環(huán)境變量
每次操作 MongoDB 都需要進入具體的目錄才行,比如啟動服務(wù),客戶端進行連接等,可不可以在任意目錄都能進行操作。答案當然是可以的,只需要將 MongoDB 相關(guān)目錄添加至系統(tǒng)環(huán)境變量即可。
先通過 vim /etc/profile 編輯系統(tǒng)環(huán)境變量文件,添加以下內(nèi)容。
# 添加環(huán)境變量
export MONGODB_HOME=/usr/local/mongodb
export PATH=$PATH:$MONGODB_HOME/bin
然后通過 source /etc/profile 重新加載系統(tǒng)環(huán)境變量。這樣在系統(tǒng)任意目錄下都可以直接操作 MongoDB 了。

本文講解了 MongoDB 的一些入門級內(nèi)容,教會了大家如何基于 Linux 環(huán)境下載與安裝 MongoDB。下文我們先從安全問題入手,看看 MongoDB 未加密導(dǎo)致的慘痛經(jīng)歷與教訓(xùn),順便再教大家一波實用的解決方案。

本文采用 知識共享「署名-非商業(yè)性使用-禁止演繹 4.0 國際」許可協(xié)議。
大家可以通過 分類 查看更多關(guān)于 MongoDB 的文章。
?? 您的點贊和轉(zhuǎn)發(fā)是對我最大的支持。
?? 關(guān)注公眾號 哈嘍沃德先生「文檔 + 視頻」每篇文章都配有專門視頻講解,學(xué)習(xí)更輕松噢 ~
