## MongoDB 相關概念
### 1.1 業務場景
傳統的關系型數據庫 (比如 MySQL), 在數據操作的”三高”需求以及對應的 Web 2.0 網站需求面前, 會有”力不從心”的感覺
所謂的三高需求:
**高并發, 高性能, 高可用**, 簡稱三高
* High Performance: 對數據庫的高并發讀寫的要求
* High Storage: 對海量數據的高效率存儲和訪問的需求
* High Scalability && High Available: 對數據的高擴展性和高可用性的需求
**而 MongoDB 可以應對三高需求**
具體的應用場景:
* 社交場景, 使用 MongoDB 存儲存儲用戶信息, 以及用戶發表的朋友圈信息, 通過地理位置索引實現附近的人, 地點等功能.
* 游戲場景, 使用 MongoDB 存儲游戲用戶信息, 用戶的裝備, 積分等直接以內嵌文檔的形式存儲, 方便查詢, 高效率存儲和訪問.
* 物流場景, 使用 MongoDB 存儲訂單信息, 訂單狀態在運送過程中會不斷更新, 以 MongoDB 內嵌數組的形式來存儲, 一次查詢就能將訂單所有的變更讀取出來.
* 物聯網場景, 使用 MongoDB 存儲所有接入的智能設備信息, 以及設備匯報的日志信息, 并對這些信息進行多維度的分析.
* 視頻直播, 使用 MongoDB 存儲用戶信息, 點贊互動信息等.
這些應用場景中, 數據操作方面的共同點有:
1. 數據量大
2. 寫入操作頻繁
3. 價值較低的數據, 對**事務性**要求不高
對于這樣的數據, 更適合用 MongoDB 來實現數據存儲
那么我們**什么時候選擇 MongoDB 呢?**
除了架構選型上, 除了上述三個特點之外, 還要考慮下面這些問題:
* 應用不需要事務及復雜 JOIN 支持
* 新應用, 需求會變, 數據模型無法確定, 想快速迭代開發
* 應用需要 2000 - 3000 以上的讀寫QPS(更高也可以)
* 應用需要 TB 甚至 PB 級別數據存儲
* 應用發展迅速, 需要能快速水平擴展
* 應用要求存儲的數據不丟失
* 應用需要`99.999%`高可用
* 應用需要大量的地理位置查詢, 文本查詢
如果上述有1個符合, 可以考慮 MongoDB, 2個及以上的符合, 選擇 MongoDB 絕不會后悔.
> 如果用MySQL呢?
>
> 相對MySQL, 可以以更低的成本解決問題(包括學習, 開發, 運維等成本)
### 1.2 MongoDB 簡介
> MongoDB是一個開源, 高性能, 無模式的文檔型數據庫, 當初的設計就是用于簡化開發和方便擴展, 是NoSQL數據庫產品中的一種.是最 像關系型數據庫(MySQL)的非關系型數據庫. 它支持的數據結構非常松散, 是一種類似于 JSON 的 格式叫BSON, 所以它既可以存儲比較復雜的數據類型, 又相當的靈活. MongoDB中的記錄是一個文檔, 它是一個由字段和值對(?eld:value)組成的數據結構.MongoDB文檔類似于JSON對象, 即一個文檔認 為就是一個對象.字段的數據類型是字符型, 它的值除了使用基本的一些類型外, 還可以包括其他文檔, 普通數組和文檔數組.
**“最像關系型數據庫的 NoSQL 數據庫”**. MongoDB 中的記錄是一個文檔, 是一個 key-value pair. 字段的數據類型是字符型, 值除了使用基本的一些類型以外, 還包括其它文檔, 普通數組以及文檔數組


MongoDB 數據模型是面向文檔的, 所謂文檔就是一種類似于 JSON 的結構, 簡單理解 MongoDB 這個數據庫中存在的是各種各樣的 JSON(BSON)
* 數據庫 (database)
* 數據庫是一個倉庫, 存儲集合 (collection)
* 集合 (collection)
* 類似于數組, 在集合中存放文檔
* 文檔 (document)
* 文檔型數據庫的最小單位, 通常情況, 我們存儲和操作的內容都是文檔
在 MongoDB 中, 數據庫和集合都不需要手動創建, 當我們創建文檔時, 如果文檔所在的集合或者數據庫不存在,**則會自動創建數據庫或者集合**
### 數據庫 (databases) 管理語法
| 操作 | 語法 |
| --- | --- |
| 查看所有數據庫 | `show dbs;`或`show databases;` |
| 查看當前數據庫 | `db;` |
| 切換到某數據庫 (**若數據庫不存在則創建數據庫**) | `use <db_name>;` |
| 刪除當前數據庫 | `db.dropDatabase();` |
### 集合 (collection) 管理語法
| 操作 | 語法 |
| --- | --- |
| 查看所有集合 | `show collections;` |
| 創建集合 | `db.createCollection("<collection_name>");` |
| 刪除集合 | `db.<collection_name>.drop()` |
### 1.3. 數據模型

### 1.4 MongoDB 的特點
#### 1.4.1 高性能
MongoDB 提供高性能的數據持久化
* 嵌入式數據模型的支持減少了數據庫系統上的 I/O 活動
* 索引支持更快的查詢, 并且可以包含來自嵌入式文檔和數組的鍵 (文本索引解決搜索的需求, TTL 索引解決歷史數據自動過期的需求, 地理位置索引可以用于構件各種 O2O 應用)
* mmapv1, wiredtiger, mongorocks (rocksdb) in-memory 等多引擎支持滿足各種場景需求
* Gridfs 解決文件存儲需求
#### 1.4.2 高可用
MongoDB 的復制工具稱作**副本集**(replica set) 可以提供自動故障轉移和數據冗余
#### 1.4.3 高擴展
水平擴展是其核心功能一部分
分片將數據分布在一組集群的機器上 (海量數據存儲, 服務能力水平擴展)
MongoDB 支持基于**片鍵**創建數據區域, 在一個平衡的集群當中, MongoDB 將一個區域所覆蓋的讀寫**只定向**到該區域的那些片
#### 1.4.4 其他
MongoDB支持豐富的查詢語言, 支持讀和寫操作(CRUD), 比如數據聚合, 文本搜索和地理空間查詢等. 無模式(動態模式), 靈活的文檔模型
- 開發語言
- java
- Java基礎篇
- Java多線程篇
- 進程和線程的區別,進程間如何通信
- 什么是線程上下文切換
- 什么是死鎖
- 死鎖的必要條件
- Synchrpnized和lock的區別
- 什么是AQS鎖
- 為什么AQS使用的雙向鏈表
- 有哪些常見的AQS鎖
- sleep()和wait()的區別
- yield()和join()區別
- Java線程池
- SpringBoot
- spring boot 項目開發常用目錄結構
- Mybatis-Plus
- MyBatisPlus的CRUD操作
- Mybatis-Plus主鍵ID生成策略
- JVM
- JVM組成
- 字節碼文件的組成
- 類的生命周期
- JVM、JRE和JDK
- arthas
- 使用阿里arthas不停機解決線上問題
- Java IO
- php
- 安裝swoole
- composer部分
- windows安裝composer
- composer PSR-4映射
- composer 鏡像同一個版本替換
- composer官方鏡像庫
- swoole部分
- swoole安裝
- thrift部分
- linux下安裝thrift
- PHP使用Thrift
- lnmp部分
- 架構的工作原理
- tp5框架生命周期
- zookeeper部分
- zookeeper安裝
- sort
- TCP和UDP的區別
- 軟件
- xdebug
- vscode+phpstudy+xdebug無法斷點(踩坑記)
- Hyperf框架
- 注解
- 通過注解定義路由
- go
- 開發方案
- 抖音
- 抖音達人視頻發布與統計
- 安全問題
- 微信
- 微信公眾平臺怎樣實現用戶點擊鏈接向公眾號發消息
- CDN加速OSS計費說明
- 程序設計
- 正則表達式
- 面向對象
- 設計模式
- 創建型模式
- 工廠模式
- 單例模式
- 結構型模式
- 適配器模式
- 行為型模式
- 策略模式
- 觀察者模式
- 算法部分
- 位運算
- 排序算法
- 雙指針
- 貪心算法
- 動態規劃
- 二分查找
- 華為題庫
- 技術棧
- mq
- MQ 的優勢和劣勢
- rabbitmq部分
- windows安裝rabbitmq
- RabbitMQ 簡介
- 工作模式
- 高級特性-消息可靠投遞-confirm
- 高級特性-消息可靠投遞-return
- 高級特性-Consumer Ack
- 高級特性-消費端限流
- 高級特性-TTL
- 高級特性-死信隊列
- Centos7下安裝rabbitmq
- 數據庫
- MongoDB
- MongoDB 相關概念
- Mysql
- 索引總結
- MySQL架構圖
- InnoDB和MyISAM的區別
- 索引設計與優化
- 悲觀鎖和樂觀鎖
- mysql如何解除死鎖狀態
- 查詢慢
- 數據庫主鍵的優缺點
- MySQL鎖詳解
- SQL語句分類
- 開查詢賬號
- 數據庫遷移
- MySQL實戰知識點
- mysql清理binlog日志
- 面試總結
- 事務隔離
- 聚集索引與非聚集索引
- B樹和B+樹
- docker
- docker-desktop安裝的坑點
- docker在linux平臺下安裝
- Ubuntu安裝Docker
- 常用命令
- 適用于 Linux 的 Windows 子系統沒有已安裝的分發版
- docker核心架構圖
- docker安裝lnmp環境
- docker安裝redis
- dockerfile
- docker-compose
- 清除容器日志
- linux
- Ubuntu 更換國內源
- centos
- 常用命令
- virtualbox
- 關于VirtualBox安裝Ubuntu時界面顯示不全,沒有下一步選項
- linux復制當前目錄到其子目錄下
- 命令
- cat和>、>>
- crontab命令
- 空間大小查詢命令
- shell登錄和非shell登錄
- nginx
- 正向代理
- 反向代理
- 負載均衡
- 分割Nginx的access.log日志并保留30天一個月時長,自動刪除多余的日志
- linux安裝nginx
- git
- 生成秘鑰
- 常用命令
- Linux中git保存用戶名密碼
- git清除賬號密碼
- 設置git store 存儲賬號密碼
- git submodule 使用小結
- 微服務
- 微服務技術棧
- nacos
- Nacos服務分級存儲模型
- Nacos配置管理-配置熱更新
- Nacos集群搭建
- 微服務保護
- 初識Sentinel
- 隔離和降級
- es
- DSL查詢語法-相關性算法
- DSL查詢語法-FunctionScoreQuery
- DSL查詢語法-BooleanQuery
- 搜索結果處理-排序
- es深度分頁問題
- 自動補全
- elasticsearch 設置密碼
- redis
- redis簡介
- linux安裝redis
- 安裝redis擴展
- redis數據類型
- redis常見問題
- PHP 使用 Redis 實現分布式鎖
- 緩存更新策略
- [ Redis ] AOF 和 RDB 的相關介紹以及相關配置
- 分布式鎖的8大坑
- 分布式鎖-Redisson
- 內存回收
- UV統計
- Redis主從集群
- redis哨兵
- Redis安裝目錄下常見文件
- 通訊原理概述
- windows
- Win系統端口被占用
- Windows10 WSL2限制cpu和內存
- jekins
- 持續集成
- centos卸載gitlab
- jenkins搭配gitlab的webhook實現自動化部署
- 大數據
- Linux集群分發腳本xsync
- hadoop
- hadoop安裝
- hadoop配置文件
- clickhouse
- ClickHouse 安裝部署
- flink
- 數據倉庫
- zookeeper
- zookeeper分布式安裝
- ZK集群啟動停止腳本
- kafka
- kafka分布式安裝
- kafka集群啟動停止腳本
- flume
- flume分布式安裝
- Flume配置
- Flume使用
- maxwell
- Maxwell簡介
- Maxwell部署
- Maxwell使用
- MaxwellBootstrapUtility - Connections could not be acquired from the underlying database
- 線上事故