MongoDB-01
標簽: MongoDB
重新定義OLTP數據庫
On-Line Transaction Processing聯機事務處理過程(OLTP)
-
什么是MongoDB
一個以Json為數據模型的文檔數據庫。
-
為什么叫文檔數據庫?
文檔來自于”JSON Document", 并非我們一般理解的PDF,word…
- 主要用途
應用數據庫,類似于Oracle, Mysql海量數據處理,數據平臺。
- 主要特點
建模為可選
Json數據模型比較適合開發者
橫向擴展可以支持很大數據量和并發
- 2018年開始支持事務
- 優點:
- 文檔模型
- OLTP
- 復制集
- 通過原生分片支持橫向擴展能力
- 索引支持
feature
面向開發者的易用+高效數據庫
對象模型的數據庫
靈活:快速響應業務變化
多行行:同一個集合中可以包含不同字段(類型))
原生的高可用和橫向擴展能力(默認最少三個節點)
Replica Set-2 to 50個成員
MongoDB CURD Operations
Insert
如果集合不存在,自動創建集合.
Insert a Single Document
db.collection.insertOne()
db.inventory.insertOne(
{ item: "canvas", qty: 100, tags: ["cotton"], size: { h: 28, w: 35.5, uom: "cm" } }
)
insertOne 會返回插入文檔的id屬性 _id
Insert Multiple Documents
db.collection.insertMany()
db.inventory.insertMany([
{ item: "journal", qty: 25, tags: ["blank", "red"], size: { h: 14, w: 21, uom: "cm" } },
{ item: "mat", qty: 85, tags: ["gray"], size: { h: 27.9, w: 35.5, uom: "cm" } },
{ item: "mousepad", qty: 25, tags: ["gel", "blue"], size: { h: 19, w: 22.85, uom: "cm" } }
])
insertMany 會返回插入成功的id信息.
-
MongoDB會自動創建集合
-
插入語句會自動為沒有包含
_id
屬性的文檔自動生成一個_id
屬性用做改文檔的主鍵信息。 -
所有的MongoDB的插入操作是原子性的。
Query
db.collection.find({})
db.inventory.find({})
等值查詢
db.inventory.find({"qty":25})
In 查詢
db.inventory.find({"qty":{$in:[50,100]}})
And
db.inventory.find({"qty":25},{"status":"A"})
Or
db.inventory.find({$or:[ {"qty":25},{"status":"A"}]})
Update
更新一條記錄
db.inventory.updateOne(
{item:"paper"},
{
$set:{"size.uom":"cm",status:"P"},
$currentDate:{lastModified: true}
}
)
更新第一個item字段為”paper"的記錄,修改它的size.uom 為 “cm",status改為:“P”,更新字段最后修改日期為當前日期。
更新多條記錄
db.inventory.updateMany(
{"qty": {$lt: 50}},
{
$set:{"size.uom": "in", status:"P"},
$currentDate: {lastModified: true}
}
)
Delete
刪除所有記錄
db.inventory.deleteMany({})
有條件的刪除記錄
db.inventory.deleteMany({"status": "A"})
刪除一條記錄
db.inventory.deleteOne({status: "D"})
會刪除所有匹配中的記錄中的第一條記錄
文本查找
Example data:
db.stores.insert(
[
{ _id: 1, name: "Java Hut", description: "Coffee and cakes" },
{ _id: 2, name: "Burger Buns", description: "Gourmet hamburgers" },
{ _id: 3, name: "Coffee Shop", description: "Just coffee" },
{ _id: 4, name: "Clothes Clothes Clothes", description: "Discount clothing" },
{ _id: 5, name: "Java Shopping", description: "Indonesian goods" }
]
)
創建索引
db.stores.createIndex({name: "text", description: "text"})
$text
通過$text 使用 text 索引 執行查找,并且在文本通過空格表示or連接符
db.stores.find( { $text: { $search: "java coffee shop" } } )
準確條件時的查詢為了避免錯誤的將空格理解為or,通過 \ 轉義
db.stores.find( { $text: { $search: "\"coffee shop\"" } } )
排除文本操作, 使用 - 表示不包含
db.stores.find( { $text: { $search: "java shop -coffee" } } )
排序
db.stores.find(
{ $text: { $search: "java coffee shop" } },
{ score: { $meta: "textScore" } }
).sort( { score: { $meta: "textScore" } } )
todo:
- 地理位置查詢
- 讀隔離,寫確認
- 原子性和事務性
在執行寫操作的時候,單記錄的寫操作是原子性的。如果寫操作是多記錄的,原子性也是體現在單條記錄的操作上,
在一次寫操作上,如果操作記錄是涉及多條記錄的情況,在整體的多行操作上不是原子性的。如果在執行當前寫操作過程中,如果有其他線程同樣執行寫操作,就有可能會發生交叉操作的情況,從4.0版本開始,MongoDB支持在復制集上支持多記錄上的事務性。在4.2版本開始支持分布式事務。
并發控制
- 通過在制定字段上創建唯一索引,具體實現如:
update() and Unique
and findAndModify() and Unique Index
Aggregation
Aggregation Framework是一個計算框架
管道(Pipleline)和步驟(Stage)
- 整個聚合運算過程稱為pipleline,它是由多個步驟(Stage)組成的,每個管道:
- 接受一系列文檔(原始數據)
- 每個步驟對這些文檔進行一系列運算;
- 結果文檔輸出給下一個步驟;
聚合運算的基本格式
Pipleline = [$stage1, $stage2, #stage3, …]
db..aggregate(
Pipleline,
{options}
)
常見步驟
$match 過濾 lt gt and or…
$project 投影 map reduce …
$sort 排序 sum avg push addtoSet
$group 分組
limit 結果限制
$lookup 左外鏈接
$unwimd 展開數組
$bucket 分組統計
$facet 聚合bucket.
Demo:
[外鏈圖片轉存失敗,源站可能有防盜鏈機制,建議將圖片保存下來直接上傳(img-IJQlPbaU-1584866771729)(/Users/leejiliang/Library/Application Support/typora-user-images/image-20200322093608659.png)]
db.orders.aggregate([
{ $match: { status: "A" } },
{ $group: { _id: "$cust_id", total: { $sum: "$amount" } } }
])
Optimization
- Projection
通過截取一個Collection的部分內容來優化查詢結果。刪除一些不必要的字段信息。
- Sequence
Replication
復制集作用
- 實現服務高可用
- 數據分發:將數據從一個區域復制到另外一個區域,減少另一個區域的讀延遲
- 讀寫分離:不同類型的壓力分散在不同的節點上執行
- 異地容災:在數據中心故障時快速切換到其他服務器
實現的原理
- 數據寫入時將數據迅速復制到另一個獨立節點上
- 在接受寫入的節點發生故障時自動選舉出一個新的節點代替主節點
典型復制集結構
三個以上具有投票權的節點組成典型復制集,包括:
- 一個主節點(PRIMARY) : 接受寫入操作和選舉時投票
- 多個從節點(SECONDARY) : 復制主節點上的新數據和選舉時負責投票
- Arbiter(選舉節點)

數據復制過程
-
Mongo會在主節點發生變更時,將變更操作記錄下來(類似Mysql binLog),記錄稱為:oplog.
-
從節點通過不斷的獲取主節點上oplog的變動信息,在從節點上執行以保證跟主節點保持數據一致。

選舉過程
-
具有投票權的節點之間兩兩發送心跳,保持節點狀態被可知;
-
5次心跳未收到時判斷為節點故障
-
如果故障的是主節點,從節點會發起選舉,選舉出新的節點
-
如果是從節點,不會發起選舉
-
選舉是基于(RAFT一致性算法)實現,選舉成功的必要條件是(大多數投票節點存活)
-
復制集中最多可以有50個節點,但是選舉節點最多有7個。
影響選舉的因素
- 整個集群必須有大多數節點存活
- 被選舉為主節點的節點要求:
- 能夠與多數節點建立連接
- 具有比較新的oplog
- 如果配置了優先級,優先選擇優先級比較高的節點
復制集節點可選配置項
-
是否具有投票權
-
priority 被選舉為主節點的優先級, 為0時不能被選舉為主節點
-
hidden 用于復制數據,但是對應用不可見,可以擁有投票權,優先級必須設置為0,被用來做安全備份

- slaveDelay 延遲復制主節點數據,和主節點保持一點的時間差,用于防止誤操作。

Replication 搭建
TODO:—
參考:
MonngoDB官網 https://docs.mongodb.com/manual/
極客時間: MongoDB高手課
智能推薦
Mongodb
1.什么是Mongodb mongodb是一個基于分布式文件存儲的數據庫. 2.Mongodb安裝 1)下載 可以直接從官網下載:https://www.mongodb.com 也可以下載我提供的版本: https://pan.baidu.com/s/1uz-Gix5kQVQa05SMfJPenw 提取碼: trr1 2)安裝 在win7系統安裝mongodb需要vc++運行...
MongoDB
http://www.runoob.com/mongodb/mongodb-create-database.html 1、這里在windows上操作 2、下載地址https://www.mongodb.com/download-center?jmp=tutorials#community 可以不安裝compass 3、創建保存數據庫的目錄結構 4、安裝: ...
MongoDB
復制集簡介 Mongodb復制集由一組Mongod實例(進程)組成,包含一個Primary節點和多個Secondary節點,Mongodb Driver(客戶端)的所有數據都寫入Primary,Secondary從Primary同步寫入的數據,以保持復制集內所有成員存儲相同的數據集,提供數據的高可用。 下圖(圖片源于Mongodb官方文檔)是一個典型的Mongdb復制集,包含一個Primary節點...
freemarker + ItextRender 根據模板生成PDF文件
1. 制作模板 2. 獲取模板,并將所獲取的數據加載生成html文件 2. 生成PDF文件 其中由兩個地方需要注意,都是關于獲取文件路徑的問題,由于項目部署的時候是打包成jar包形式,所以在開發過程中時直接安照傳統的獲取方法沒有一點文件,但是當打包后部署,總是出錯。于是參考網上文章,先將文件讀出來到項目的臨時目錄下,然后再按正常方式加載該臨時文件; 還有一個問題至今沒有解決,就是關于生成PDF文件...
猜你喜歡
電腦空間不夠了?教你一個小秒招快速清理 Docker 占用的磁盤空間!
Docker 很占用空間,每當我們運行容器、拉取鏡像、部署應用、構建自己的鏡像時,我們的磁盤空間會被大量占用。 如果你也被這個問題所困擾,咱們就一起看一下 Docker 是如何使用磁盤空間的,以及如何回收。 docker 占用的空間可以通過下面的命令查看: TYPE 列出了docker 使用磁盤的 4 種類型: Images:所有鏡像占用的空間,包括拉取下來的鏡像,和本地構建的。 Con...
requests實現全自動PPT模板
http://www.1ppt.com/moban/ 可以免費的下載PPT模板,當然如果要人工一個個下,還是挺麻煩的,我們可以利用requests輕松下載 訪問這個主頁,我們可以看到下面的樣式 點每一個PPT模板的圖片,我們可以進入到詳細的信息頁面,翻到下面,我們可以看到對應的下載地址 點擊這個下載的按鈕,我們便可以下載對應的PPT壓縮包 那我們就開始做吧 首先,查看網頁的源代碼,我們可以看到每一...
Linux C系統編程-線程互斥鎖(四)
互斥鎖 互斥鎖也是屬于線程之間處理同步互斥方式,有上鎖/解鎖兩種狀態。 互斥鎖函數接口 1)初始化互斥鎖 pthread_mutex_init() man 3 pthread_mutex_init (找不到的情況下首先 sudo apt-get install glibc-doc sudo apt-get install manpages-posix-dev) 動態初始化 int pthread_...
統計學習方法 - 樸素貝葉斯
引入問題:一機器在良好狀態生產合格產品幾率是 90%,在故障狀態生產合格產品幾率是 30%,機器良好的概率是 75%。若一日第一件產品是合格品,那么此日機器良好的概率是多少。 貝葉斯模型 生成模型與判別模型 判別模型,即要判斷這個東西到底是哪一類,也就是要求y,那就用給定的x去預測。 生成模型,是要生成一個模型,那就是誰根據什么生成了模型,誰就是類別y,根據的內容就是x 以上述例子,判斷一個生產出...