• <noscript id="e0iig"><kbd id="e0iig"></kbd></noscript>
  • <td id="e0iig"></td>
  • <option id="e0iig"></option>
  • <noscript id="e0iig"><source id="e0iig"></source></noscript>
  • MongoDB-01

    標簽: MongoDB

    重新定義OLTP數據庫

    On-Line Transaction Processing聯機事務處理過程(OLTP)

    • 什么是MongoDB

      一個以Json為數據模型的文檔數據庫。

    • 為什么叫文檔數據庫?

    文檔來自于”JSON Document", 并非我們一般理解的PDF,word…

    • 主要用途

    應用數據庫,類似于Oracle, Mysql海量數據處理,數據平臺。

    • 主要特點

    建模為可選

    Json數據模型比較適合開發者

    橫向擴展可以支持很大數據量和并發

    • 2018年開始支持事務
    • 優點:
    1. 文檔模型
    2. OLTP
    3. 復制集
    4. 通過原生分片支持橫向擴展能力
    5. 索引支持

    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:

    1. 地理位置查詢
    2. 讀隔離,寫確認
    3. 原子性和事務性

    在執行寫操作的時候,單記錄的寫操作是原子性的。如果寫操作是多記錄的,原子性也是體現在單條記錄的操作上,

    在一次寫操作上,如果操作記錄是涉及多條記錄的情況,在整體的多行操作上不是原子性的。如果在執行當前寫操作過程中,如果有其他線程同樣執行寫操作,就有可能會發生交叉操作的情況,從4.0版本開始,MongoDB支持在復制集上支持多記錄上的事務性。在4.2版本開始支持分布式事務。

    并發控制

    1. 通過在制定字段上創建唯一索引,具體實現如:

    update() and Uniqueand findAndModify() and Unique Index

    Aggregation

    Aggregation Framework是一個計算框架

    管道(Pipleline)和步驟(Stage)

    • 整個聚合運算過程稱為pipleline,它是由多個步驟(Stage)組成的,每個管道:
    1. 接受一系列文檔(原始數據)
    2. 每個步驟對這些文檔進行一系列運算;
    3. 結果文檔輸出給下一個步驟;

    聚合運算的基本格式

    Pipleline = [$stage1, $stage2, #stage3, …]

    db..aggregate(

    Pipleline,

    {options}

    )

    常見步驟

    $match 過濾 lt gt and or…

    $project 投影 map reduce …

    $sort 排序 sum avg push addtoSet

    $group 分組

    skip/skip/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

    1. Projection

    通過截取一個Collection的部分內容來優化查詢結果。刪除一些不必要的字段信息。

    1. Sequence

    Replication

    復制集作用

    1. 實現服務高可用
    2. 數據分發:將數據從一個區域復制到另外一個區域,減少另一個區域的讀延遲
    3. 讀寫分離:不同類型的壓力分散在不同的節點上執行
    4. 異地容災:在數據中心故障時快速切換到其他服務器

    實現的原理

    1. 數據寫入時將數據迅速復制到另一個獨立節點上
    2. 在接受寫入的節點發生故障時自動選舉出一個新的節點代替主節點

    典型復制集結構

    三個以上具有投票權的節點組成典型復制集,包括:

    1. 一個主節點(PRIMARY) : 接受寫入操作和選舉時投票
    2. 多個從節點(SECONDARY) : 復制主節點上的新數據和選舉時負責投票
    3. Arbiter(選舉節點)
    replication

    數據復制過程

    • Mongo會在主節點發生變更時,將變更操作記錄下來(類似Mysql binLog),記錄稱為:oplog.

    • 從節點通過不斷的獲取主節點上oplog的變動信息,在從節點上執行以保證跟主節點保持數據一致。

    copy-process

    選舉過程

    • 具有投票權的節點之間兩兩發送心跳,保持節點狀態被可知;

    • 5次心跳未收到時判斷為節點故障

    • 如果故障的是主節點,從節點會發起選舉,選舉出新的節點

    • 如果是從節點,不會發起選舉

    • 選舉是基于(RAFT一致性算法)實現,選舉成功的必要條件是(大多數投票節點存活)

    • 復制集中最多可以有50個節點,但是選舉節點最多有7個。

    影響選舉的因素

    1. 整個集群必須有大多數節點存活
    2. 被選舉為主節點的節點要求:
    • 能夠與多數節點建立連接
    • 具有比較新的oplog
    • 如果配置了優先級,優先選擇優先級比較高的節點

    復制集節點可選配置項

    • 是否具有投票權

    • priority 被選舉為主節點的優先級, 為0時不能被選舉為主節點

    • hidden 用于復制數據,但是對應用不可見,可以擁有投票權,優先級必須設置為0,被用來做安全備份

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

    Replication 搭建

    TODO:—

    參考:
    MonngoDB官網 https://docs.mongodb.com/manual/
    極客時間: MongoDB高手課

    版權聲明:本文為leejiliang原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接和本聲明。
    本文鏈接:https://blog.csdn.net/leejiliang/article/details/105030441

    智能推薦

    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節點...

    HTML中常用操作關于:頁面跳轉,空格

    1.頁面跳轉 2.空格的代替符...

    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 以上述例子,判斷一個生產出...

    精品国产乱码久久久久久蜜桃不卡