MongoDB基礎學習

 

MongoDB基礎  2018-12-14

一個基於分佈式文件存儲的數據庫,介於關係數據庫和非關係數據庫之間的產品,是非關係數據庫當中功能最豐富 MongoDB將數據存儲爲一個文檔,數據結構由鍵值(key-value)對組成,MongoDB文檔相似於JSON對象,字段值能夠包含其餘文檔,數組及文檔數組html

MongoDB不一樣平臺的安裝

點擊訪問連接git

MongoDB概念

因爲MongoDB數據庫在關係型和非關係型數據庫之間,其數據庫結構相似關係型數據庫github


SQL術語/概念     MongoDB術語/概念   解釋/說明
database          database          數據庫
table             collection        數據庫表/集合
row               document          數據記錄行/文檔
column            field             數據字段/域
index                               index   索引
table joins                         錶鏈接,MongoDB不支持
primary key       primary key       主鍵,MongoDB自動將_id字段設置爲主鍵

RDBMS       MongoDB
數據庫         數據庫
表格           集合
行            文檔
列            字段
表聯合         嵌入文檔
主鍵           主鍵 (MongoDB 提供了 key 爲 _id

鏈接MongoDB數據庫

mongodb://[username:password@]host1[:port1][,host2[:port2],...[,hostN[:portN]]][/[database][?options]]web

1.mongodb://    固定格式,必須制定
2.username:password@    可選,鏈接到數據庫後會參數登陸這個數據庫
3.host1 必須指定一個host
4.portx 可選指定端口,不填默認27017
5./database 若是指定username:password@,鏈接並驗證登陸指定數據庫,若不指定,默認打開test數據庫
6.?options  鏈接選項,全部鏈接選項都是鍵值對name=value,鍵值對之間經過&或;隔開

MongoDB數據庫查看

mongodb中默認的數據庫爲test,若是沒有建立新的數據庫,集合將存放在test數據庫中正則表達式

- use database_name
    - 若是數據庫不存在,則建立數據庫,不然切換到指定數據庫
- show dbs
    - 查看全部數據庫
- show tables
    - 查看某數據中的全部集合
- db.數據庫名.insert({'key':'value'})
    - 剛建立的數據庫並不在數據庫列表中,插入數據才顯示

MongoDB刪除數據庫

-db.dropDatabase()
    - 刪除當前數據庫,默認爲test
- db.集合名.drop()
    - 刪除數據庫中的集合

MongoDB建立/刪除 集合(至關於表)

- db.createCollection(name,options) 建立
    - name:要建立的集合名稱
    - options:可選參數,指定有關內存大小以及索引
        - capped    布爾
            - 若是爲 true,則建立固定集合。固定集合是指有着固定大小的集合,當達到最大值時,它會自動覆蓋最先的文檔。當該值爲 true 時,必須指定 size 參數。
        - autoindeld    布爾
            - 如爲 true,自動在 _id 字段建立索引。默認爲 false。
        - size  數值  
            - 爲固定集合指定一個最大值(字節計)
        - max   數值
            - 指定固定集合包含文檔的最大數量
- db.collection.drop()  刪除
    - 成功刪除選定集合,則drop()方法返回true 不然返回false

MongoDB插入文檔

文檔的數據結構和json基本同樣
全部存儲在集合中的數據都是BSON格式
BSON是一種類json的一種二進制形式的存儲格式

 

-mongodb 使用insert()或save()方法向集合中插入文檔
    -insert() 當插入數據中 _id在文檔中存在則報錯
    - save()  當插入數據中 _id存在則覆蓋原來文檔
-db.集合名.insert(document)

MongoDB更新/刪除文檔

-更新文檔 db.集合名.update/save()  
    -update(
        <query>,    #查詢條件
        <update>,   #update的對象和一些更新的操做符(如$,$inc)等,也能夠理解爲sql update查詢內set後面
        {
            upsert:<boolean>,   #可選 若是不存在update的記錄,是否插入objNew,true爲插入,默認是false,不插入
            multi:<boolean>,    #可選 mongodb 默認是false,只更新找到的第一條記錄,若是這個參數爲true,就把按條件查出來多條記錄所有更新。
            writeConcern:<document> #可選 拋出異常的級別
        }
        )   
    - save(
        document>,  #文檔數據
        {
          writeConcern: <document>  可選,拋出異常
        }
        )
- 刪除文檔  db.集合名.remove()
    在文檔刪除前先經過find()命令判斷執行條件是否正確

    - remove(
            <query>,    #可選 刪除文檔的條件
            <justOne>   #可選 若是設爲 true 或 1,則只刪除一個文檔,若是不設置該參數,或使用默認值 false,則刪除全部匹配條件的文檔。
            writeConcern: <document>    (可選)拋出異常的級別
        )

MongoDB查詢文檔

-find       #查詢全部
    - db.集合名稱.find()
-findone()  #查詢第一個
    - db.集合名稱.findone()
-pretty()   #將結果格式化
    - db.集合名稱.find().pretty()

比較運算符

操做 格式 範例 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

邏輯運算符

- and 
    - db.集合名稱.find({key1:value1,key2:value2})
- or
    - db.集合名稱.find(
           {
              $or: [
                 {key1: value1}, {key2:value2}
              ]
           }
        ).pretty()

範圍運算符

-in
    - db.集合名.find(
            {
                $in:[範圍值]
            }

模糊匹配

- / /
    - db.集合名.find(
            {
                <key>:/匹配字段/
            }
        )

正則表達式

-使用 // 或 $regex 編寫正則表達式
    -實例:
        db.集合名.find({stu:/^abc/})
        db.集合名.find({stu:{$regex:"^abc"}})
-db.集合名.find(
            {
                <field>:{$regex:"pattern",$options:"<options>"}
            }
        )

    -options可選項:能夠組合使用
        -i 忽略大小寫
        -m 多行匹配模式
        -x 忽略非轉義的空白字符
        -s 單行匹配模式

Limit與skip方法

須要在MongoDB中讀取指定數量的數據記錄,可使用MongoDB的Limit方法,
limit()方法

 

-limit()    
    - db.集合名.find().limit(number)
    - 接受一個數字參數,該參數指定從MongoDB中讀取的記錄條數。

- skip()    默認參數爲0
    - db.集合名.find().skip(number)
    - 跳過指定數量的數據,skip方法一樣接受一個數字參數做爲跳過的記錄條數。
-兩個方法能夠組合使用
    - db.集合名.find().skip(num).limit(num)
    或  db.集合名.find().limit(num).skip(num)

MongoDB排序、統計個數、消除重複

-sort()     #排序
    - db.集合名.find().sort({key:1})
        - sort() 方法能夠經過參數指定排序的字段,並使用 1 和 -1 來指定排序的方式,
        - 其中 1 爲升序排列,而 -1 是用於降序排列。
- count()       #統計個數
    - db.集合名.find().count()
    或   db.集合名.count({條件})

- distinct()    #消除重複(對數據去重)
    - db.集合名.distinct(key,{條件})

MongoDB投影

-字符的顯示
    -實例:db.stu.find({age:{$gt:18},{name:1,_id:0}})
    - 設置爲1顯示,_id設置爲0不顯示

MongoDB索引

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

-createIndex()      #建立索引
    - db.集合名.createIndex(keys,options)
        -  Key 值爲你要建立的索引字段(一致多個key),1 爲指定按升序建立索引,-1 爲指定按降序建立索引

        - ooptions參數參考地址:http://www.runoob.com/mongodb/mongodb-indexing.html
-getIndexts()       #查看當前集合全部索引
    - db.集合名.getIndexs()
- dropIndex()       #刪除集合指定索引
    - db.集合名.dropIndex("索引名")
- dropIndexs()      #刪除集合全部索引   
- totalIndexSize()  #查看集合索引大小
    - db.集合名.totalIndexSize()

MongoDB聚合

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

- aggregate()
    - db.集合名稱.aggregate(aggregate_opeation)

聚合表達式

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

表達式 描述 實例
$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"}}}])

管道

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

管道實例:如下的例子均無數據做爲前提,經過自行腦補

1.$group

將集合中的文檔分組,可用於統計結果json

- 實例:求學生總人數,平均年齡
    db.stu.aggregate(
        {
             _id:null,  #其分組的依據是 _id:後面的字段
            counter:{$sum:1},
            avgage:{$avg:'$age'}    #須要執行的字段須要添加 $
        }
    )

2.$project

修改輸入文檔的結構canvas

-實例:在$group 中的輸出結果 存在 _id ,可經過$project修改
    db.stu.aggregate(
        {$group:{_id:'$gender',count:{$sum:1},avg_age:{$avg:'$age'}}},
        {$project:{gender:'$_id',count:1,avg_age:1,_id:0}}  #當_id設置爲0 ,其字段隱藏
    )

3.$match

用於過濾數據,只輸出符合條件的文檔,把結果交給下一管道,find()不能夠

-實例:選擇年齡大於20的學生,觀察男性和女性有多少人
    db.stu.aggregate(
            { $match:{ age:{$gt:20} } },
            { $group:{_id:"$gender",count:{$sum:1} } },
            { $project:{ _id:0,gender:"$_id",count:1 } }
        )

4.sort()

將輸入文檔排序後輸出 -實例:查詢學生信息,按年齡升序 db.stu.aggregate( { $sort:{age:1} } )

5.limit()

在聚合管道中跳過指定數量的文檔,並返回餘下的文檔

-實例:跳過前兩個文檔
    db.stu.aggreagate(
        {
            $limit:2
        }
    )

6.unwind()

將文檔中的某一個數組類型字段拆分紅多條,每條包含數組中的一個值。

-實例1:
    添加實驗數據:db.t1.insert({_id:1,item:'t-shirt',size:['S','M','L']})
    執行:
        db.t1.aggregate(
            {$unwind:'$size'}
        )
    結果:
        {"_id":1,"item":"t-shirt","size":"S"},
        {"_id":1,"item":"t-shirt","size":"S"},
        {"_id":1,"item":"t-shirt","size":"S"}
-實例2:保留某字段沒有對應拆分的集合,(即保留size爲null或爲空的文檔)
    db.t1.aggregate(
        {
            $unwind:{
                path:'$size',preserveNullAandEmptyArrays:true
            }
        }
    )

MongoDB複製(副本集)和分片

詳情請點擊此博文

MongoDB複製集

複製的基本架構:由3臺服務器組成,一個三成員的複製集,由三個有數據,或者兩個有數據,一個做爲仲裁者

MongoDB分片

高數據量和吞吐量的數據庫應用會對單機的性能形成較大壓力,大的查詢量會將單機的CPU耗盡,大的數據量對單機的存儲壓力較大,最終會耗盡系統的內存而將壓力轉移到磁盤IO上。

解決方案:

垂直擴展:增長更多的CPU和存儲資源來擴展容量。

水平擴展:將數據集分佈在多個服務器上。水平擴展即分片。

分片集羣架構

組件 說明
Config Server 存儲集羣全部節點、分片數據路由信息。默認須要配置3個Config Server節點。
Mongos 提供對外應用訪問,全部操做均經過mongos執行。通常有多個mongos節點。數據遷移和數據自動平衡。
Mongod 存儲應用數據記錄。通常有多個Mongod節點,達到數據分片目的。

1. mongos :數據路由,和客戶端打交道的模塊。mongos自己沒有任何數據,他也不知道該怎麼處理這數據,去找config server
2. config server:全部存、取數據的方式,全部shard節點的信息,分片功能的一些配置信息。能夠理解爲真實數據的元數據。
3. shard:真正的數據存儲位置,以chunk爲單位存數據。

MongoDB備份與恢復

-mongodump -h dbhost -d dbname -o dbdirectory
    -h MongoDB所在服務器地址   例如:127.0.0.1:27017
    -d 須要備份的數據庫實例   例如:test
    -o 備份的數據存放位置        例如:c:/data/dump
-mongorestore -h <hostname><:port> -d dbname <path>
    -host<:port>,-h <:port>
        - MongoDB所在服務器地址,默認:localhost:27017
    - db,-d:
        - 須要恢復的數據庫實例,例如:test
    - drop:
        - 恢復的時候,先刪除當前數據,而後恢復備份數據
    - <path>:
        - mongorestore 最後的一個參數,設置備份數據所在位置,例如:c:\data\dump\test。
            - 你不能同時指定 <path> 和 --dir 選項,--dir也能夠設置備份目錄。
    - dir:
        - 指定備份的目錄
            - 不能同時指定<path>和 --dir選項
相關文章
相關標籤/搜索